分析一个小DEMO
程序:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
b.Fun2(a);
}
}
这个输出结果是1 和6
我不明白为什么,以我看该是输出2和6,请详细解说下
------解决方案--------------------B b = new B(); 创建实例。
A a = new A(); 创建实例。
b.Fun2(a); 调用b的Fun2 ,b自己没Fun2,进入基类a的Fun2
public void Fun2(A a)
{
a.Fun1(1); //实例a的Fun1(1)当然输出个 1。
Fun1(5); //这里由于是b的实例调用进来的,所以进入b的overide的Fun1 ,然后base.Fun1 (i + 1),调用基类的Fun1; 输出6 ,完毕。
}
------解决方案--------------------毫无悬念的代码,
A 是 A,
B 是 B,
多看几遍代码,
------解决方案--------------------为什么a.Fun1(1)不是调用B.Fun1(1)呢?
里面已经表明a.了,可能调用b的吗/
overide不是把所有的调用都overide了,否则之前的不白写了,如果有多重overide,难道我们只能调用最后一个overide的方法吗?
多态性是根据对象来的,方法是对象的方法. 多看看书了解基本概念吧.