¿Por qué necesito declarar un método virtual cuando puedo ocultarlo en una clase derivada?

class clsTestParent
    {
       public void testNoAbstract()
        {
            Console.WriteLine("Parent Method Call");
        }
    }

    class clsDerivedTest : clsTestParent
    {
     public void testNoAbstract()
        {
            Console.WriteLine("Child Method Hiding Parent Method");
        }
    }

            clsTestParent objParent = new clsTestParent();
            clsTestParent objOfParentFromDerived = new clsDerivedTest();
            clsDerivedTest objDerived = new clsDerivedTest();

            objParent.testNoAbstract();
            objOfParentFromDerived.testNoAbstract();
            objDerived.testNoAbstract();

Salida:
Llamada al método principal
Llamada al método principal
Método secundario Ocultación del método principal

Pero cuando declaro testNoAbstract() como virtual y over ride en la clase derivada, entonces la salida será la siguiente:

Parent Method Call  
Child Method Hiding Parent Method
Child Method Hiding Parent Method

Antes solía pensar que solo podemos redefinir un método en una clase derivada, si eso se define como abstract or virtual , pero como podemos ver ahora, podemos ocultar el método de la clase padre simplemente redefiniéndolo en la clase derivada.

Aunque puedo ver la diferencia en la salida al cambiar el código, me gustaría saber cuáles son las diferencias entre los dos métodos anteriores y por qué produce una salida diferente.

preguntado el 08 de noviembre de 11 a las 14:11

2 Respuestas

If alguna vez lo harás clsTestParent a = new clsDerivedTest () - ¡¡¡¡Nunca podrás ejecutar el de la clase clsDerivedTest !!!!

Esa es la diferencia y por eso el compilador te advierte.

de hecho, lo hará si desea preformar una arquitectura de polimorfismo.

Microsoft te dice : "Escuche, dirigió una clase y le daremos todas las cosas públicas, etc. pero no sabemos cómo desea implementar los métodos ... si usa la anulación virtual +, podrá ejecutar una método diferente a través del tipo de instancia. y si no lo anula, por lo que la función del padre siempre se ejecutará ... es su elección ... le advertimos "... y ellos advierten

respondido 08 nov., 11:18

Es por eso que 'redefinición' es una mala palabra para eso. La llamada virtual resuelve el tiempo de ejecución de su tipo, por eso pudo:

    clsTestParent objOfParentFromDerived = new clsDerivedTest();
    objOfParentFromDerived.testAbstractOrVirtual(); // marked as virtual or abstract in base class

y la llamada se resolvió en tiempo de ejecución, al método definido en una clase que objOfParentFromDerived realmente es (new operador - clsDerivedTest), y no al método definido en una clase con la que se declaró (clsTestParent).

Si no esta marcado tampoco virtual or abstract entonces el compilador le advierte, porque la llamada se resolverá en base al tipo con el que se ha declarado la variable.

respondido 08 nov., 11:18

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.