Estoy aprendiendo C# y me encontré con el siguiente problema. Tengo dos clases: de base y derivados:C# Ocultación, anulación y función de llamada de la clase base
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
Por ahora, sin virtual
y override
palabras clave. Cuando compilo esto, recibo la advertencia (que, por supuesto, se espera) de que trato de ocultar MyMethod
de la clase MyBase
.
Lo que quiero hacer es llamar al método de la clase base que tiene una instancia de clase derivada. Lo hago así:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
Funciona bien cuando no se especifican virtual
, etc. palabras clave en los métodos. He intentado poner combinación de las palabras clave y me dieron los siguientes resultados:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
espero que el cuadro es claro para usted. Tengo dos preguntas:
- ¿es la forma correcta de llamar a la función de la clase base (
((MyBase)myDerived).MyMethod();
)? Sé acerca de la palabra clavebase
, pero solo se puede llamar desde el interior de la clase derivada. ¿Es correcto? - ¿Por qué en el último caso (con
virtual
yoverride
modificadores) el método que se llamó provino de la clase derivada? ¿Podrías por favor explicar eso?
¿Puede explicar lo que * quiere * y no lo que experimentó? Todo lo que puedo decir ahora es que "Sí, eso parece correcto". Para la última pregunta, debería leer sobre cómo funciona el despacho virtual de métodos. Consulte http://en.wikipedia.org/wiki/Virtual_method_table para obtener información. –