• 小例子分析C#继承机制


    using System;
    
    class test
    {
        public class A
        {
            public virtual void fun1(int i)
            {
                Console.WriteLine(i);
            }
            public void fun2(A a)
            {
                a.fun1(3);
                fun1(7);
            }
        }
        
        public class B : A
        {
            public override void fun1(int i)
            {
                Console.WriteLine(i+1);
            }
        }
        
        public static void Main()
        {
            A a = new A();
            B b = new B();
            a.fun2(b);
            b.fun2(a);
        }
    }

    上面的程序里,类B继承了类A,并在Main()函数里分别产生了这两个类的实例变量a,b

    a.fun2(b);

    是如下执行的:
    1. 对象a首先调用A类的fun2方法,fun2(A a)需要的是一个A类型的实例变量,而这里的
        实际参数却是B类型的实例变量b。所以这里会隐式的将b转化成A类型,转化过程中,
        b将丢失掉自己独有特性。
    2. 执行b.fun1(3),b的fun1方法覆盖掉了A类的fun1方法,故这里实际执行B类的fun1
       方法,打印出4(i+1)。
    3. 执行fun1(7),这里没有指明调用对象,默认为当前调用对象。当前是a在调用,则执行
        a.fun1(7),a是A类的实例变量,则执行A类的fun1,打印出7(i)。

    b.fun2(a);

    是如下执行的:
    1. 由于B类中并没有fun2方法,则执行其父类A的fun2方法,这里实际参数是一个A类型的实例
        变量a,故不需要做任何转换。
    2. 执行a.fun1(3),打印出3(i)。
    3. 执行fun1(7),即b.fun1(7),打印出8(i+1)。

    程序最后的输出应该是:
    4
    7
    3
    8

  • 相关阅读:
    python+OpenCV 特征点检测
    如何使用《DB 查询分析器》高效地生成旬报货运量数据
    Hive-RCFile文件存储格式
    NET:交换机的背板带宽,交换容量,包转发率区别
    css:cdata
    [ZOJ 3623] Battle Ships
    [NYOJ 860] 又见01背包
    [Uva 11825] Hackers’ Crackdown
    2014-10-29
    [转] 三鲜之所在
  • 原文地址:https://www.cnblogs.com/CoderWayne/p/4483921.html
Copyright © 2020-2023  润新知