大家帮忙详细分析解答下关于继承的题目,被搞得有点晕...
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
------解决方案--------------------看了这个lz还不明白,就无能为力了:
C#的虚函数解析机制
------解决方案-------------------- 任何一个没有使用 override 或 sealed 关键字的方法定义都将成为继承链的开端;
如果该类在定义方法时使用了 virtual 关键字,则会被附加到继承链中。
继承链的结束取决于两个因素:若子类中存在使用了 new 关键字的同名方法,则之前的继承链立刻结束(该方法不会被添加到继承链中);若子类中存在使用了 sealed 关键字的同名方法,则在将该方法添加到继承链后,然后结束继承链。
------解决方案--------------------我想 打印 结果的 是:
A
B
A.Fun();
首先 我们 来分析一下 题目:
A a = new B(); 实例化对象,New B() 相当于 创建了B的实例化, 因为B是继承A的,所以。。。先打印出来的是 A, 再打印出来的就是子类里的B了,
最后它调用的方法是 a.Fun(); 因为 子类里
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
很明显它 并没有 重写 父类的 Fun() 方法,也就是 子类并没有override, 所以调用 a.Fun(); 方法的时候,打印出来的就是父类里的方法执行的 代码了。
不知道这样解析,Lz 是否理解?