Explorando métodos virtuales y abstractos en C #

El lenguaje de programación C # proporciona soporte tanto para métodos virtuales como abstractos, cada uno de los cuales tiene distintas ventajas. Utiliza métodos virtuales para implementar el enlace tardío, mientras que los métodos abstractos le permiten forzar que las subclases del tipo tengan el método anulado explícitamente. En esta publicación, presentaré una discusión sobre los métodos virtuales y abstractos y cuándo deberían usarse.

Un método virtual es aquel que se declara como virtual en la clase base. Un método se declara como virtual especificando la palabra clave "virtual" en la firma del método. Un método virtual puede tener o no un tipo de retorno. Los métodos virtuales permiten que las subclases del tipo anulen el método. Se utilizan para implementar polimorfismo en tiempo de ejecución o enlace tardío. Cabe señalar que los miembros virtuales o abstractos de una clase no se pueden declarar como privados. Además, puede tener una implementación en un método virtual, es decir, los métodos virtuales pueden tener implementaciones en ellos. Estas implementaciones pueden ser anuladas por las subclases del tipo en el que se ha definido el método virtual.

MSDN afirma: "La palabra clave virtual se usa para modificar un método, propiedad, indexador o declaración de evento y permitir que se anule en una clase derivada".

Ahora profundicemos en algún código para tener una mejor claridad sobre cómo se utilizan los métodos virtuales. Consulte el fragmento de código a continuación.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

El método Test () se declara como virtual en la clase Base y se anula en la clase Derived. Observe cómo se usa la palabra clave virtual para declarar el método como virtual en la clase Base. La palabra clave virtual no es necesaria cuando anula el método virtual en la clase Derived.

Ahora, consulte el fragmento de código que se proporciona a continuación que ilustra cómo se llaman a los métodos virtuales.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Tenga en cuenta que se crean dos instancias de la clase Base: baseObj1 y baseObj2. En el primer caso, el objeto de referencia denominado baseObj1 se refiere a una instancia de la clase Base. En el segundo caso, el objeto de referencia denominado baseObj2 se refiere a una instancia de la clase Derived. Cuando ejecuta el código, la primera llamada al método virtual mostraría el mensaje "Esta es la versión base del método virtual" en la consola. En el segundo caso, se mostraría el mensaje "Esta es la versión derivada del método virtual". ¿Por qué esta diferencia?

En el primer caso, se considera el tipo de objeto de referencia baseObj1; como es de tipo Base, se llamará a la versión base del método virtual. En el segundo caso, se considerará el contexto del objeto de referencia baseObj2 y, por lo tanto, el resultado.

Los métodos abstractos son aquellos que se declaran abstractos en la clase base y no pueden tener implementaciones en ellos, es decir, no pueden tener ninguna funcionalidad en ellos. Puede utilizar métodos abstractos cuando desee que el método se anule con fuerza en las clases derivadas del tipo en el que se ha definido el método abstracto. Esto lo aplica el compilador en tiempo de compilación. Por lo tanto, si ha declarado un método como abstracto utilizando el modificador abstracto en una clase base, las subclases de esta clase tendrían que implementar el método abstracto en caso de que el compilador muestre un error que indique que la clase derivada no ha implementado el resumen. miembro. En esencia,un método abstracto se declara utilizando la palabra clave abstracta en una clase base abstracta y las subclases no abstractas de este tipo deben tener su propia implementación del método abstracto. Los métodos abstractos también son implícitamente de naturaleza virtual, pero no se puede utilizar la palabra clave virtual al declarar un método abstracto. Cabe señalar que los métodos abstractos solo se pueden declarar dentro de clases abstractas.

Un uso típico de un método abstracto es forzar la anulación de los métodos ToString () o Equals (). El siguiente fragmento de código ilustra cómo se declaran los métodos abstractos en una clase abstracta denominada EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

La clase EntityBase es el tipo base para todas las entidades; la clase de entidad Cliente extiende esta clase y proporciona implementación para los métodos abstractos. En esencia, todas las clases de entidad proporcionarían su propia implementación de los métodos ToString () y Equals (). No se necesita una implementación predeterminada para estos métodos en la clase base y, por lo tanto, se marcan como abstractos. Por lo tanto, la invalidación del método se aplica al declarar el método como abstracto en la clase base denominada EntityBase.