primordial es cuando se proporciona un nuevo override
implementación de un método en una clase descendiente cuando se defina ese método en la clase base como virtual
.
de ocultación es cuando se proporciona una nueva implementación de un método en una clase descendiente cuando ese método es no definido en la clase base como virtual
, o cuando su nueva aplicación no especifica override
.
Ocultar es a menudo malo; en general, debes tratar de no hacerlo si puedes evitarlo en absoluto. Ocultar puede hacer que ocurran cosas inesperadas, porque los métodos ocultos solo se usan cuando se invoca una variable del tipo real que se definió, no si se usa una referencia de clase base ... por otro lado, los métodos virtuales que se anulan terminarán con se llama a la versión de método apropiada, incluso cuando se llama utilizando la referencia de clase base en una clase secundaria.
Por ejemplo, considere las siguientes clases:
public class BaseClass
{
public virtual void Method1() //Virtual method
{
Console.WriteLine("Running BaseClass Method1");
}
public void Method2() //Not a virtual method
{
Console.WriteLine("Running BaseClass Method2");
}
}
public class InheritedClass : BaseClass
{
public override void Method1() //Overriding the base virtual method.
{
Console.WriteLine("Running InheritedClass Method1");
}
public new void Method2() //Can't override the base method; must 'new' it.
{
Console.WriteLine("Running InheritedClass Method2");
}
}
Vamos a llamarlo así, con una instancia de InheritedClass, en una referencia coincidente:
InheritedClass inherited = new InheritedClass();
inherited.Method1();
inherited.Method2();
Esto devuelve lo que debe esperar; ambos métodos dicen que están ejecutando las versiones de InheritedClass.
Correr InheritedClass Método1
Correr InheritedClass Método2
Este código crea una instancia de la misma, InheritedClass, pero la almacena en una referencia BaseClass:
BaseClass baseRef = new InheritedClass();
baseRef.Method1();
baseRef.Method2();
Normalmente, en programación orientada a objetos principios, debe esperar el mismo resultado que en el ejemplo anterior. Pero no obtiene el mismo resultado:
Correr InheritedClass Método1
Correr BaseClass Método2
Cuando escribió el código InheritedClass, es posible que haya querido todas las llamadas a Method2()
para ejecutar el código que escribió en ella. Normalmente, así sería como funciona, suponiendo que está trabajando con un método virtual
que ha anulado.Pero debido a que está utilizando un método oculto new
/, llama a la versión de la referencia que está utilizando, en su lugar.
Si ese es el comportamiento que realmente quiere , entonces; ahí tienes. Pero le sugiero encarecidamente que, si eso es lo que quiere, puede haber un problema arquitectónico más grande con el código.
después de pasar por google he estado aquí con mis problemas ... – NoviceToDotNet
Parece que necesita aprender conceptos básicos de programación de C#, antes de poder comprender el método de anulación y ocultación. Pruebe uno de los muchos libros de principiante C# alrededor. – thecoop
1) a.m1(); // ¿Qué se imprimirá y por qué? Simplemente Imprimirá '" hai a todos "' porque está utilizando el concepto de anulación de Método. 2) b = a; // ¿Qué pasa aquí? Aquí obtendremos un error de compilación porque el objeto de clase hijo no se referirá al objeto de la clase Base. Y el reverso es posible de acuerdo con el concepto de Herencia. – Krish