¿Cuál es la diferencia entre un método abstracto y un método virtual?

Resuelto Moran Helman asked hace 15 años • 27 respuestas

¿Cuál es la diferencia entre un método abstracto y un método virtual? ¿En qué casos se recomienda utilizar métodos abstractos o virtuales? ¿Cuál es el mejor enfoque?

Moran Helman avatar Dec 24 '08 21:12 Moran Helman
Aceptado

Una función abstracta no puede tener funcionalidad. Básicamente estás diciendo que cualquier clase secundaria DEBE proporcionar su propia versión de este método; sin embargo, es demasiado general para intentar implementarlo en la clase principal.

Una función virtual básicamente significa mirar, aquí está la funcionalidad que puede o no ser lo suficientemente buena para la clase secundaria. Entonces, si es lo suficientemente bueno, use este método; si no, anúlelo y proporcione su propia funcionalidad.

BFree avatar Dec 24 '2008 14:12 BFree

Una función abstracta no tiene implementación y solo puede declararse en una clase abstracta. Esto obliga a la clase derivada a proporcionar una implementación.

Una función virtual proporciona una implementación predeterminada y puede existir en una clase abstracta o no abstracta.

Así por ejemplo:

public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
JoshBerke avatar Dec 24 '2008 14:12 JoshBerke
  1. Sólo abstractlas clases pueden tener abstractmiembros.
  2. Una no abstractclase que hereda de una abstractclase debe tener override sus abstractmiembros.
  3. Un abstractmiembro es implícitamente virtual.
  4. Un abstractmiembro no puede proporcionar ninguna implementación ( abstractasí se llama pure virtualen algunos idiomas).
Mehrdad Afshari avatar Apr 16 '2009 09:04 Mehrdad Afshari

Siempre debes anular una función abstracta.

De este modo:

  • Funciones abstractas : cuando el heredero debe proporcionar su propia implementación
  • Virtual : cuando le corresponde al heredero decidir
Rinat Abdullin avatar Dec 24 '2008 14:12 Rinat Abdullin

Función abstracta:

  1. Sólo se puede declarar dentro de una clase abstracta.
  2. Contiene solo la declaración del método, no la implementación en la clase abstracta.
  3. Debe anularse en la clase derivada.

Función virtual:

  1. Se puede declarar tanto dentro de una clase abstracta como no abstracta.
  2. Contiene la implementación del método.
  3. Puede ser anulado.
Lexnim avatar May 28 '2014 07:05 Lexnim