从derived而不是base调用的虚方法
有人可以向我解释为什么在将类转换为基类时调用重写的方法:
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
它是一个运行时或编译时的未来?
我知道我可以通过调用base.VirtualMethod()
来调用Base的虚方法,但是我可以从外面调用吗? (如来自Main
或其他课程)
基于对象的执行时类型选择方法实现。 这是它的重要组成部分。 任何人都可以用:
public void Foo(Base b) { b.VirtualMethod(); }
……并且不需要知道或关心执行类型是什么,因为多态性会处理它。
我知道我可以通过调用base.VirtualMethod()来调用Base的虚方法,但是我可以从外面调用吗?
不(至少,不是没有一些可怕的hackery非虚拟地调用虚方法),这是封装的故意部分。 覆盖实现已有效地替换了该对象的原始实现。
如果要访问基本实现,则不应使用override,应使用new。 覆盖覆盖任何父实现,新“隐藏”父实现,以便您可以通过强制转换为父对象然后调用该方法来访问实现。
internal class Program { private static void Main(string[] args) { Derived d = new Derived(); d.VirtualMethod(); ((Base) d).VirtualMethod(); Console.ReadLine(); } private class Base { public virtual void VirtualMethod() { Console.WriteLine("Base virtual method"); } } private sealed class Derived : Base { public new void VirtualMethod() { Console.WriteLine("Overriden method"); } } }
这将输出:
Overriden方法
基本虚方法