Este equipo de trabajo ha estado por horas buscando la resolución a tus preguntas, te compartimos la soluciones de modo que nuestro deseo es servirte de gran apoyo.
Solución:
Bueno, está probando con solo dos niveles de herencia, y no está llegando al punto de “anular aún más” un método. Si lo haces tres, puedes ver lo que sealed
lo hace:
class Base
public virtual void Test() ...
class Subclass1 : Base
public sealed override void Test() ...
class Subclass2 : Subclass1
public override void Test() ... // Does not compile!
// If `Subclass1.Test` was not sealed, it would've compiled correctly.
un sellado clase es una clase que no puede ser una clase base de otra clase más derivada.
un sellado método en una clase no sellada es un método que no se puede anular en una clase derivada de esta clase.
¿Por qué usamos métodos sellados? ¿Cuáles son las ventajas de los métodos sellados?
Bueno, ¿por qué usas métodos virtuales? Para proporcionar un punto en el que se puede personalizar el comportamiento de una clase. Entonces, ¿por qué usas métodos sellados? Para proporcionar un punto en el que tenga la garantía de que no se producirán más cambios en el comportamiento de ninguna clase derivada con respecto a este método..
Los puntos donde se puede personalizar el comportamiento de una clase son útil pero peligroso. Son útiles porque permiten que las clases derivadas cambien el comportamiento de la clase base. Son peligrosos… espéralo… porque permiten que las clases derivadas cambien el comportamiento de la clase base. Los métodos virtuales básicamente permiten que terceros hagan que sus clases funcionen loco cosas que nunca anticipó o probó.
Me gusta escribir código que haga lo que anticipo y lo que probé. Sellar un método le permite continuar permitiendo que se anulen partes de la clase mientras hace que los métodos sellados tengan un comportamiento garantizado, comprobable y estable que no se puede personalizar más.
Bueno, solo usarías “sellado” en un método si no desea que ninguna clase derivada anule aún más su método. Los métodos están sellados de forma predeterminada, si no se declaran como virtuales y no anulan otro método virtual. (En Java, los métodos son virtuales de forma predeterminada: para lograr un comportamiento de C# “predeterminado”, debe marcar un método como final
.)
Personalmente, me gusta controlar la herencia con cuidado; prefiero que las clases enteras estén selladas siempre que sea posible. Sin embargo, en algunos casos aún desea permitir la herencia, pero asegúrese de que algunos los métodos no se anulan más. Un uso podría ser una plantilla efectiva del método, por ejemplo, para diagnósticos:
public sealed override void Foo(int x)
Log("Foo called with argument: 0", x);
FooImpl(x);
Log("Foo completed");
protected abstract void FooImpl(int x);
Ahora las subclases no pueden anularse Foo
directamente – tendrían que anular FooImpl
, por lo que nuestro comportamiento será siempre ser ejecutado cuando otro código llama Foo
.
La plantilla podría ser por otras razones, por supuesto, por ejemplo, para hacer cumplir ciertos aspectos de la validación de argumentos.
En mi experiencia, los métodos sellados no se usan muy a menudo, pero me alegro de que la capacidad esté ahí. (Solo desearía que las clases estuvieran selladas de forma predeterminada, pero esa es otra conversación).
Tienes la opción de añadir valor a nuestro contenido contribuyendo tu experiencia en las observaciones.