Diferencia entre métodos virtuales y abstractos

Aquí hay un código de MSDN :

// compile with: /target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } } 

¿Puede alguien explicar el código anterior con respecto a las diferencias entre los métodos abstractos y virtuales?

Los métodos virtuales tienen una implementación y proporcionan a las clases derivadas la opción de anularla. Los métodos abstractos no proporcionan una implementación y obligan a las clases derivadas a anular el método.

Por lo tanto, los métodos abstractos no tienen código real en ellos, y las subclases TIENEN QUE anular el método. Los métodos virtuales pueden tener código, que generalmente es una implementación predeterminada de algo, y cualquier subclase PUEDE anular el método usando el modificador de override y proporcionar una implementación personalizada.

 public abstract class E { public abstract void AbstractMethod(int i); public virtual void VirtualMethod(int i) { // Default implementation which can be overridden by subclasses. } } public class D : E { public override void AbstractMethod(int i) { // You HAVE to override this method } public override void VirtualMethod(int i) { // You are allowed to override this method. } } 

En primer lugar, debe saber la diferencia entre un método virtual y un método abstracto.

Método abstracto

  • El método abstracto reside en la clase abstracta y no tiene cuerpo.
  • El método abstracto se debe anular en la clase secundaria no abstracta.

Método virtual

  • El método virtual puede residir en una clase abstracta y no abstracta.
  • No es necesario anular el método virtual en derivado, pero puede ser.
  • El método virtual debe tener cuerpo … puede ser anulado por “sobrescribir palabra clave” …..

un método abstracto debe ser anulación de llamada en la clase derivada; de lo contrario, dará un error de tiempo de comstackción y en virtual puede o no anular su dependencia si es lo suficientemente bueno como para usarlo

Ejemplo:

 abstract class twodshape { public abstract void area(); // no body in base class } class twodshape2 : twodshape { public virtual double area() { Console.WriteLine("AREA() may be or may not be override"); } } 

Método abstracto:

  • Si se define un método abstracto en una clase, la clase debe declararse como una clase abstracta.

  • Un método abstracto debe contener solo la definición del método, no debe contener el cuerpo / implementación del método.

  • Un método abstracto debe ser sobrepasado en la clase derivada.

Método virtual:

  • Los métodos virtuales pueden ser sobrepasados ​​en la clase derivada pero no obligatorios.
  • Los métodos virtuales deben tener el cuerpo / implementación del método junto con la definición.

Ejemplo:

 public abstract class baseclass { public abstract decimal getarea(decimal Radius); public virtual decimal interestpermonth(decimal amount) { return amount*12/100; } public virtual decimal totalamount(decimal Amount,decimal principleAmount) { return Amount + principleAmount; } } public class derivedclass:baseclass { public override decimal getarea(decimal Radius) { return 2 * (22 / 7) * Radius; } public override decimal interestpermonth(decimal amount) { return amount * 14 / 100; } }