Introdução à palavra-chave virtual em C #

Qual é a palavra-chave virtual? Antes de pular direto para a perspectiva de C #, é importante entender ou revisar o conceito de herança, substituição e palavra-chave virtual no mundo da programação orientada a objetos.

A Substituição de Método é um conceito de POO estreitamente associado à Herança. Quando um método de classe filho substitui o método de classe pai com o mesmo nome, parâmetros e tipo de retorno, é denominado como substituição de método. Uma palavra-chave virtual é uma indicação para o compilador de que um método pode ser substituído em classes derivadas.

Chegando à perspectiva do C #, a palavra-chave virtual é usada para modificar a declaração de qualquer propriedade, método ou evento para permitir a substituição em uma classe derivada. Em termos simples, a palavra-chave virtual implementa o conceito de substituição de método em C #.

Sintaxe

Qualquer propriedade, método ou evento pode ser substituído, adicionando a palavra-chave virtual na classe base e substituindo a palavra-chave na classe derivada.

Adicione a palavra-chave virtual na declaração da classe base:

public class Base (
public virtual int abc ( get; set; ) // this property can be overridden
public virtual void Xyz() ( ) // this method can be overridden
)

Adicione a palavra-chave override na declaração da classe base:

public class Derived : Base (
public override int abc ( get; set; ) // this overrides the base class property
public override void Xyz() ( ) // this overrides the base class method
)

Como o virtual funciona em c #?

A diferença muito básica entre sobrecarga e substituição é que o primeiro é um mecanismo de tempo de compilação, enquanto o último entra em ação no tempo de execução. Uma palavra-chave virtual entra em ação no tempo de execução, implementando o conceito de substituição de método.

Quando qualquer método ou propriedade virtual é invocado ou acessado, o compilador verifica se há um membro que substitui o método ou a propriedade. Se um for encontrado, é invocado. Se nenhum for encontrado, o método ou a propriedade original é invocada.

Uma excelente pergunta aqui surge - o que acontece no caso da herança multinível? Bem, se qualquer membro da classe for substituído em mais de um nível, o membro substituído mais profundo será chamado (aquele da classe mais derivada).

Exemplo

O exemplo a seguir de palavra-chave virtual em C # é mencionado abaixo

Herança de Nível Único

Vamos dar um exemplo para entender o funcionamento de uma palavra-chave virtual quando uma única classe filha herda a classe pai, ou seja, não há herança multinível.

using System;
public class Polynomial
(
public virtual double len
(
get;
set;
)
public virtual double wid
(
get;
set;
)
public virtual double Area()
(
return len * wid;
)
)
public class Rectangle: Polynomial
(
)
public class Square : Polynomial
(
public override double len
(
get;
set;
)
public override double Area()
(
return len * len;
)
)
public class Circle : Polynomial
(
public double radius
(
get;
set;
)
public override double Area()
(
return Math.PI * radius * radius;
)
)
public class Triangle : Polynomial
(
public override double Area()
(
return 0.5 * len * wid;
)
)
public class Program
(
public static void Main()
(
var rect = new Rectangle();
rect.len = 5;
rect.wid = 10;
Console.WriteLine("Area of Rectangle = " + rect.Area());
var sq = new Square();
sq.len = 15;
Console.WriteLine("Area of Square = " + sq.Area());
var cir = new Circle();
cir.radius = 10;
Console.WriteLine("Area of Circle = " + cir.Area());
var tri = new Triangle();
tri.len = 5;
tri.wid = 10;
Console.WriteLine("Area of Triangle = " + tri.Area());
)
)

Como o código acima funciona?

Na classe base Polynomial, declaramos duas propriedades e um método como virtual. Agora eles podem ser substituídos em classes filho. Agora, criamos várias classes filho de formas diferentes, herdando a classe Polynomial.

Na classe Rectangle, não precisamos substituir nenhuma propriedade ou método. A implementação da classe base funcionaria como está para a classe Rectangle.

Na classe Square, não temos a propriedade width. Portanto, substituímos a propriedade length e o método Area para retornar o quadrado do comprimento.

Na classe Circle, não temos comprimento nem largura. Portanto, declaramos uma nova propriedade específica de classe de raio e substituímos o método Area de acordo.

Na classe Triangle, simplesmente substituímos o método Area e as propriedades são herdadas da classe base Polynomial.

Quando criamos objetos das classes derivadas, o compilador encontra a palavra-chave virtual durante a construção da classe base e, assim, procura os membros substituídos. Os membros substituídos são então chamados de acordo.

Herança multinível

Vamos modificar o exemplo acima para incluir herança multinível.

using System;
public class Polynomial
(
public virtual double len ( get; set; )
public virtual double wid ( get; set; )
public virtual double Area()
( return 0; )
)
public class Rectangle : Polynomial
(
public override double Area()
( return len * wid; )
)
public class Square : Rectangle
(
public override double len ( get; set; )
public override double Area()
( return len * len; )
)
public class Program
(
public static void Main()
(
var rect = new Rectangle();
rect.len = 5;
rect.wid = 10;
Console.WriteLine("Area of Rectangle = " + rect.Area());
var sq = new Square();
sq.len = 15;
Console.WriteLine("Area of Square = " + sq.Area());
)
)

Vantagens

Um membro virtual possui declarações e definições na classe base e nas classes derivadas. Membros virtuais são vantajosos quando algumas funcionalidades extras são necessárias nas classes derivadas. Eles servem como complementos.

Regras

  • Uma variável não pode ser declarada virtual. Somente propriedades, métodos e eventos podem ser declarados como virtuais.
  • Um membro estático não pode ser declarado virtual.
  • Um membro abstrato não pode ser declarado virtual.
  • Um membro privado não pode ser declarado virtual.
  • Um membro não virtual não pode ser substituído.
  • O nível de acesso, tipo e nome dos membros virtuais e dos membros substitutos devem ser os mesmos. Por exemplo, se o método virtual for público, o método de substituição também deverá ser público.

Conclusão - Palavra-chave Virtual em C #

Neste artigo, entendemos o conceito de virtual em C #. Vimos como o C # implementa a palavra-chave virtual durante o tempo de execução e analisamos os exemplos.

Membros virtuais são um ótimo conceito de programação orientada a objetos. No entanto, para obter conhecimento aprofundado, é altamente recomendável aprender sobre palavras-chave abstratas, interfaces e novas palavras-chave. Isso ajudaria muito a entender a diferença entre todos eles. Isso ajuda a perceber quando usar e quando não usar virtual.

Artigos recomendados

Este é um guia para palavras-chave virtuais em C #. Aqui discutiremos Como funciona o virtual em C # e como o código acima funciona com as vantagens e herança de vários níveis. Você também pode consultar o seguinte artigo para saber mais:

  1. Copiar Construtor em C #
  2. Herança em C #
  3. Funções C #
  4. C # if Instrução
  5. Instrução If em Python
  6. Sobrecarga em Java
  7. Sobrecarga de Python
  8. Herança em PHP
  9. Guia completo de herança em Python
  10. Tipos de construtor em C # com implementação de código