c# - sirve - usar metodos de una clase abstracta
¿Cuál es el uso de ''anulación abstracta'' en C#? (7)
Solo por curiosidad, traté de reemplazar un método abstracto en la clase base y el método de la implementación abstracta. Como a continuación:
public abstract class FirstAbstract
{
public abstract void SomeMethod();
}
public abstract class SecondAbstract : FirstAbstract
{
public abstract override void SomeMethod();
//?? what sense does this make? no implementaion would anyway force the derived classes to implement abstract method?
}
Tengo curiosidad por saber por qué el compilador de C # permite escribir ''anulación abstracta''. ¿No es redundante? Debe ser un error de tiempo de compilación para hacer algo como esto. ¿Sirve para algún caso de uso?
Gracias por tu interés.
Curiosamente, la versión Roslyn del compilador de C # tiene un método de anulación abstracto, que me pareció bastante extraño escribir un artículo sobre:
Este patrón de diseño se conoce como patrón de Método de plantilla.
Página de Wikipedia sobre métodos de plantillas.
Un ejemplo simple, que no es de software: hay un montón de unidades militares: tanques, aviones, soldados, acorazados, etc. Todos ellos necesitan implementar algunos métodos comunes pero los implementarán de manera muy diferente:
- Movimiento()
- Ataque()
- Retirada()
- Descanso()
etc ...
Esto se hace porque en la clase secundaria no se puede tener abstract
método abstract
con el mismo nombre que en la clase base. override
le dice al compilador que está anulando el comportamiento de la clase base.
Espero que esto sea lo que buscas.
Hay un ejemplo útil para esto en MSDN : básicamente, puede obligar a una clase derivada a proporcionar una nueva implementación para un método.
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.
}
}
Si un método virtual se declara abstracto, aún es virtual para cualquier clase heredada de la clase abstracta. Una clase que hereda un método abstracto no puede acceder a la implementación original del método; en el ejemplo anterior, DoWork en la clase F no puede llamar a DoWork en la clase D. De esta manera, una clase abstracta puede forzar a las clases derivadas a proporcionar nuevas implementaciones de métodos para métodos virtuales .
Imagine que SecondAbstract
encuentra en medio de una jerarquía de tres clases, y desea implementar algunos métodos abstractos desde su FirstAbstract
base, mientras que deja otro método X para ser implementado desde su ThirdAbstract
hijo.
En este caso, SecondAbstract
se ve obligado a decorar el método X con un abstract
ya que no desea proporcionar una implementación; al mismo tiempo, se ve obligado a decorarlo con override
ya que no está definiendo un nuevo método X, sino que quiere trasladar la responsabilidad de implementar X a su hijo. Por lo tanto, abstract override
.
En general, los conceptos modelados por abstract
y override
son ortogonales. La primera fuerza a las clases derivadas a implementar un método, mientras que la segunda reconoce que un método es el mismo que el especificado en una clase base y no uno new
.
Por lo tanto:
- ni palabra clave: método "simple"
- solo
abstract
: clase derivada debe implementar - solo
override
: implementación del método definido en la clase base -
abstract override
: la clase derivada debe implementar un método definido en la clase base
Me parece muy útil para asegurar la ToString()
adecuada de ToString()
en clases derivadas. Supongamos que tiene una clase base abstracta y realmente desea que todas las clases derivadas definan una ToString()
significativa de ToString()
porque la está utilizando activamente. Puedes hacerlo de forma muy elegante con abstract override
:
public abstract class Base
{
public abstract override string ToString();
}
Es una señal clara para los implementadores que ToString()
se usará en la clase base de alguna manera (como escribir la salida al usuario). Normalmente, no pensarían en definir esta anulación.
Si no declaró SomeMethod
como abstract override
en SecondAbstract
, el compilador esperaría que esa clase contenga una implementación del método. Con abstract override
, está claro que la implementación debe estar en una clase derivada de SecondAbstract
y no en SecondAbstract
.
Espero que esto ayude...