C#面向对象的编程问题 - 重写方法

时间:2015-02-20 15:03:12

标签: c# oop casting polymorphism

在C#中考虑这段代码:

    public class A
    {
        public A()
        {
            Console.WriteLine("A");
        }
        public virtual void One()
        {
            Console.WriteLine("One of A");
        }
        public virtual void Two()
        {
            One();
        }
    }

    public class B : A
    {
        public B()
        {
            Console.WriteLine("B");
        }
        public override void One()
        {
            Console.WriteLine("One of B");
        }
        public override void Two()
        {
            Console.WriteLine("Two of B");
        }
        public void Three()
        {
            base.Two();
        }
    }

和主要:

A a3 = new B(); //"A" and then "B"
a3.Two();' //"Two of B"
((B)a3).Three(); //"One of B"

为什么主程序中的最后一行写了“B'之一”? 为什么当它执行One()时它会转到B的One()?

3 个答案:

答案 0 :(得分:8)

分解每个方法调用的内容 -

((B)a3).Three(); 

呼叫

B.Three();

调用

A.Two();

调用

A.One();

但是A.One虚拟,这意味着系统必须在运行时查看对象的实际类型以确定哪个< / em> One将被调用。

由于a3引用的对象是B(即使您声明它为A变量引用),B.One()是调用。

答案 1 :(得分:0)

因为变量a3是类型B,并且因为类型A&#39; s两个方法被标记为virtual,所以编译器推断应该调用的方法是类型B&#39;被覆盖的One()的实现。

答案 2 :(得分:0)

因为类A的方法One()被声明为虚拟并且它在类B中找到了覆盖,所以它选择了覆盖。