类继承及方法覆写小例分析

例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】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值