¿Cuál es la diferencia entre un método abstracto y un método virtual?
¿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?
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.
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();
}
- Sólo
abstract
las clases pueden tenerabstract
miembros. - Una no
abstract
clase que hereda de unaabstract
clase debe teneroverride
susabstract
miembros. - Un
abstract
miembro es implícitamentevirtual
. - Un
abstract
miembro no puede proporcionar ninguna implementación (abstract
así se llamapure virtual
en algunos idiomas).
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
Función abstracta:
- Sólo se puede declarar dentro de una clase abstracta.
- Contiene solo la declaración del método, no la implementación en la clase abstracta.
- Debe anularse en la clase derivada.
Función virtual:
- Se puede declarar tanto dentro de una clase abstracta como no abstracta.
- Contiene la implementación del método.
- Puede ser anulado.