C#面向对象程序设计问题-重写方法



在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之一"?为什么当它执行一()时会转到B的一()?

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

((B)a3).Three(); 

调用

B.Three();

它调用

A.Two();

它调用

A.One();

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

由于a3引用的对象是B(即使您将其声明为A变量引用),因此会调用B.One()

因为变量a3是类型B,并且类型A的Two方法标记为virtual,所以编译器推断应该调用的方法是类型B对One()的重写实现。

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

最新更新