例1:
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 override void Fun()
{
Console.WriteLine("B.Fun() ");
}
}
------------Test----------------
A a = new B();
a.Fun();
分析:A a = new B();
执行:New B(内容未执行)-> New A(执行) -> 返回到 B(执行)。 输出:A B
分析:a.Fun();
由于B重写了A的Fun方法,所以直接执行B.Fun()。 输出: B.Fun()。
如果把B中的public override void Fun() 改为 public new void Fun(),将输出: A.Fun()。
所以Override 和 New 还是有一定的区别的。(在一些论坛上看到有人讨论,认为此时Override 和 new一样,都可以覆盖基类方法)
=======================================================================================
例2:
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);
}
}
------------Test----------------
A a = new A();
B b = new B();
a.Fun2(b);
b.Fun2(a);
原则:以实际传入的类型为准,而不管其是否进行类型转换。
分析: a.Fun2(b);
执行: a.Fun2(b) 中的a.Fun1(1): b.Fun1(1)->a.Fun1(1+1) 输出:2 【此时的a实际是b】
a.Fun2(b) 中的Fun1(5); 直接调用a中的Fun1方法,输出:5 【此时调用的主体是a,不是b】
分析: b.Fun2(a);
执行: b.Fun2(a) 中的a.Fun1(1): a.Fun1(1) 输出:1 【此时的a就是a】
b.Fun2(a) 中的Fun1(5); 直接调用b.Fun1(5)方法->a.Fun1(5+1), 输出:6 【此时调用的主体是b,不是a】