我正在学习 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
在方法中指定任何 , etc. 关键字时,它可以正常工作。我尝试将关键字组合起来,得到以下结果:
| 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
修饰符)调用的方法来自派生类?你能解释一下吗?