Я изучаю C # и столкнулся со следующей проблемой.У меня есть два класса: базовый и производный:
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
Пока без ключевых слов virtual
и override
.Когда я компилирую это, я получаю предупреждение (которое, конечно, ожидается), что я пытаюсь скрыть MyMethod
от MyBase
класса.
Что я хочу сделать, это вызвать метод из базового классаэкземпляр производного класса.Я делаю это так:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
Работает нормально, когда в методах не указаны ключевые слова virtual
и т. Д.Я попытался ввести комбинацию ключевых слов и получил следующие результаты:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
Надеюсь, таблица вам понятна. У меня два вопроса :
- Это правильный способ вызова функции из базового класса (
((MyBase)myDerived).MyMethod();
)?Я знаю о ключевом слове base
, но его можно вызывать только из производного класса.Правильно ли это? - Почему в последнем случае (с модификаторами
virtual
и override
) вызванный метод был получен из производного класса?Не могли бы вы объяснить это?