一道理解c#中对象(引用类型)相互赋值和方法覆盖(overriding)的题目

时间:2022-08-30 17:37:48

2009-07-11 14:18

using System;
ClassA
{
public virtual void M()
{
Console.WriteLine("A");
}
}
ClassB:ClassA
{
public override void M()
{
Console.WriteLine("B");
}
}
ClassC:ClassB
{
new public virtual void M()
{
Console.WriteLine("C");
}
}
ClassD:ClassC
{
public override void M()
{
Console.WriteLine("D");
}
[STAThread]
static void Main(string[] args)
{
D d=new D();
C c=d;
B b=c;
A a=b;
//分别调用一下这几个对象中的M方法
D.M();
C.M();
B.M();
A.M();
}
}

程序的输出结果:
D
D
B
B

题目就是让写出程序输出结果。
此题中C c=d;B b=c;A a=b;这几句是考察对象间赋值,对象是引用类型,相互不能直接传递数据,赋值后仅仅是传递了指向相应对象地址的指针。就相当于转变为另外对象。
昨天又看了这段,有新感想,写出来共享。
在执行 C c=d; 后并不是简单的传递了指向对象的指针,而是把D类型的d转换为C类型的c了,由于M()为覆盖方法,虽然d被转换为C类型的对象了但仍然要调用D类型的M()方法,这就实现了转换后覆盖父类方法的目的。而用new 重写的方法则不能,是因为此方法与父类的同样的方法已经没有关系,尽管模样一样。而且覆盖(override)还可以通过继承树传递,只要中间不间断,就可以一直向父类传递直至最终父类。