Introducción a la palabra clave virtual en C #

¿Cuál es la palabra clave virtual? Antes de saltar directamente a la perspectiva de C #, es importante comprender o revisar el concepto de herencia, anulación y palabra clave virtual en el mundo de la programación orientada a objetos.

La anulación del método es un concepto de OOP muy relacionado con la herencia. Cuando un método de clase secundaria anula el método de clase primaria del mismo nombre, parámetros y tipo de retorno, se denomina anulación de método. Una palabra clave virtual es una indicación para el compilador de que un método puede ser anulado en clases derivadas.

Al llegar a la perspectiva de C #, la palabra clave virtual se usa para modificar la declaración de cualquier propiedad, método o evento para permitir la anulación en una clase derivada. En términos simples, la palabra clave virtual implementa el concepto de anulación del método en C #.

Sintaxis

Cualquier propiedad, método o evento puede anularse agregando la palabra clave virtual en la clase base y anulando la palabra clave en la clase derivada.

Agregue la palabra clave virtual en la declaración de la clase base:

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

Agregue la palabra clave de anulación en la declaración de clase 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
)

¿Cómo funciona virtual en C #?

La diferencia muy básica entre sobrecargar y anular es que el primero es un mecanismo de tiempo de compilación, mientras que el segundo entra en juego en tiempo de ejecución. Una palabra clave virtual entra en acción en tiempo de ejecución, implementando así el concepto de anulación del método.

Cuando se invoca o accede a cualquier método o propiedad virtual, el compilador busca un miembro principal del método o la propiedad. Si se encuentra uno, se invoca. Si no se encuentra ninguno, se invoca el método o propiedad original.

Aquí surge una excelente pregunta: ¿qué sucede en el caso de la herencia multinivel? Bueno, si algún miembro de la clase se anula en más de un nivel, se invoca al miembro anulado más profundo (el de la clase más derivada).

Ejemplo

El siguiente ejemplo de palabra clave virtual en C # se menciona a continuación

Herencia de un solo nivel

Tomemos un ejemplo para comprender el funcionamiento de una palabra clave virtual cuando una sola clase hija hereda la clase padre, es decir, no hay herencia multinivel.

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());
)
)

¿Cómo funciona el código anterior?

En la clase base Polynomial, hemos declarado dos propiedades y un método como virtuales. Ahora se pueden anular en las clases secundarias. Ahora creamos varias clases secundarias de diferentes formas heredando la clase Polinómica.

En la clase Rectangle, no necesitamos anular ninguna propiedad o método. La implementación de la clase base funcionaría tal cual para la clase Rectangle.

En la clase Square, no tenemos la propiedad de ancho. Por lo tanto, anulamos la propiedad de longitud y el método Área para devolver el cuadrado de la longitud.

En la clase Circle, tampoco tenemos largo ni ancho. Por lo tanto, declaramos una nueva propiedad de radio específica de la clase y anulamos el método Área en consecuencia.

En la clase Triángulo, simplemente anulamos el método Área y las propiedades se heredan de la clase base Polinomio.

Cuando creamos objetos de las clases derivadas, el compilador encuentra la palabra clave virtual durante la construcción de la clase base y, por lo tanto, busca los miembros anulados. Los miembros anulados se invocan en consecuencia.

Herencia multinivel

Modifiquemos el ejemplo anterior para incluir la herencia multinivel.

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());
)
)

Ventajas

Un miembro virtual tiene declaraciones y definiciones tanto en la clase base como en las clases derivadas. Los miembros virtuales son ventajosos cuando se requieren algunas funcionalidades adicionales en las clases derivadas. Sirven como complementos.

Reglas

  • Una variable no se puede declarar virtual. Solo las propiedades, métodos y eventos pueden declararse como virtuales.
  • Un miembro estático no se puede declarar virtual.
  • Un miembro abstracto no puede declararse virtual.
  • Un miembro privado no puede ser declarado virtual.
  • Un miembro no virtual no se puede anular.
  • El nivel de acceso, el tipo y el nombre de los miembros virtuales y los miembros primarios deben ser los mismos. Por ejemplo, si el método virtual es público, el método de anulación también debe ser público.

Conclusión: palabra clave virtual en C #

En este artículo, entendimos el concepto de virtual en C #. Vimos cómo C # implementa la palabra clave virtual durante el tiempo de ejecución y miramos los ejemplos.

Los miembros virtuales son un gran concepto de programación orientada a objetos. Sin embargo, para obtener un conocimiento profundo, se recomienda aprender sobre palabras clave abstractas, interfaces y nuevas palabras clave. Esto ayudaría enormemente a comprender la diferencia entre todos ellos. Esto ayuda a darse cuenta de cuándo usar y cuándo no usar virtual.

Artículos recomendados

Esta es una guía de palabras clave virtuales en C #. Aquí discutimos cómo funciona Virtual en C # y cómo funciona el código anterior con la herencia y las ventajas de varios niveles. También puede consultar el siguiente artículo para obtener más información.

  1. Copiar constructor en C #
  2. Herencia en C #
  3. Funciones de C #
  4. C # si declaración
  5. Sentencia If en Python
  6. Sobrecarga en Java
  7. Sobrecarga de Python
  8. Herencia en PHP
  9. Guía completa de herencia en Python
  10. Tipos de constructor en C # con implementación de código