有人可以向我解释为什么当我将类转换为基类时调用重写的方法吗:
class Base
{
public virtual void VirtualMethod()
{
Console.WriteLine("Base virtual method");
}
}
sealed class Derived : Base
{
public override void VirtualMethod()
{
Console.WriteLine("Overriden method");
}
}
static void Main(String[] args)
{
Derived d = new Derived();
((Base)d).VirtualMethod();
}
我的意思是这段代码打印:
Overriden method
而不是
Base virtual method
它是运行时还是编译时的 future ?
我知道我可以通过调用 base.VirtualMethod()
从派生调用 Base 的虚方法,但我可以从外部调用它吗? (比如来自 Main
或其他一些类)
最佳答案
方法实现是根据对象的执行时间类型来选择的。这是它的很大一部分要点。任何人都可以使用:
public void Foo(Base b)
{
b.VirtualMethod();
}
...而且不需要知道或关心执行类型是什么,因为多态性会处理它。
I know i can call the Base's virtual method from the derived by calling base.VirtualMethod() but can I call it from outside?
不(至少,不是没有一些可怕的黑客技术来非虚拟地调用虚拟方法),这是封装的一个有意的部分。覆盖实现有效地替换了该对象的原始实现。
关于c# - 从 derived 而不是 base 调用的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140911/