程序:
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,请详细解说下
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,请详细解说下
= a.Fun1(1);b.Fun1(5);
有什么问题?
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 ,完毕。
}
overide不是把所有的调用都overide了,否则之前的不白写了,如果有多重overide,难道我们只能调用最后一个overide的方法吗?多态性是根据对象来的,方法是对象的方法. 多看看书了解基本概念吧.
……
你都A a = new A(); 还想怎么样?
{
a.Fun1(1);
Fun1(5);
} 第一句里面的a是A a
所以调用的是类A的Fun1
第二句里面的Fun1是调用自己的方法
也就是类B的Fun1
a.Fun1(1);
a.Fun1(5);
输出的是 1,5a.Fun1(1); //调用A本身的Fun1方法
Fun1(5);//调用覆盖方法
所以调用的是类A的Fun1
第二句里面的Fun1是调用自己的方法
也就是类B的Fun1