内容如下
这道题是这样的 有四个类
public class ClassA
{
public virtual void print()
{
Console.WriteLine("My ClassA");
}
}
public class ClassB:ClassA
public class ClassC:ClassB
{
public virtual void print()
{
Console.WriteLine("My ClassC");
}
}
public class ClassD:ClassC
{
public override void print()
{
Console.WriteLine("My ClassD");
}
}
{
public virtual void print()
{
Console.WriteLine("My ClassA");
}
}
public class ClassB:ClassA
public class ClassC:ClassB
{
public virtual void print()
{
Console.WriteLine("My ClassC");
}
}
public class ClassD:ClassC
{
public override void print()
{
Console.WriteLine("My ClassD");
}
}
调用
ClassC Obj1=new ClassD();
Obj1.print();
ClassB Obj2=new ClassD();
Obj2.print();
ClassA Obj3=new ClassD();
Obj3.print();
Obj1.print();
ClassB Obj2=new ClassD();
Obj2.print();
ClassA Obj3=new ClassD();
Obj3.print();
结果
My ClassD
My ClassB
My ClassB
前两个结果好理解
但是第三个结果
ClassA Obj3=new ClassD();
Obj3.print();
My ClassB
为什么会这个样子 ?
翻了好多资料,
忽然想起里好几个月前曾经看过一篇文章:
<<我是谁>> http://allenlooplee.cnblogs.com/archive/2005/11/24/283578.html
于是找出来 又仔细看了一下 突然感觉自己大约可能理解了
ClassA Obj3=new ClassD();
这句代码 是声明一个受ClassA特征约束的ClassD对象 也就是说ClassA对Obj3屏蔽了除ClassA以外的特征(描述的不太准确 )
而ClassD 继承了类 C->B->A
这样 ClassD 本身的Print方法是不会被调用的 C的也不会调用 为什么会调用B的 而不调用A的呢?
我的理解是 B的方法 重写了A的方法 也就是说 B的Print 能够通过A的特征约束. 而Obj3 是D的对象, D又继承C, C继承B ,所以, D也具有B的特征! 调用优先级应该是从子类到基类, 也就是说D大于C C大于B B大于A, 而D 和C 都因为没有重写A的方法,肯定通不过 A的特征约束 所以
ClassA Obj3=new ClassD();
Obj3.print();
必定会输出
My ClassB
不过目前 这些都是我自己个人理解 希望高手能指出我的理解错误 和不对的地方