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