Я изучаю С# и столкнулся со следующей проблемой. У меня есть два класса: базовый и производный:
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
) вызываемый метод пришел из производного класса? Не могли бы вы объяснить это?