zoukankan      html  css  js  c++  java
  • C# 继承(3)

    接上章代码:

     class NameList
        {
            public NameList() => Console.WriteLine("这个是NameList的构造函数");
    
            ~NameList() => Debug.WriteLine("释放NameList");
    
            public string Name { get; set; }
    
            public void ID() => Console.WriteLine($"我的id是{Name}");
        }
    
    
        class A : NameList
        {
    
            public A() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            ~A() => Debug.WriteLine("释放A");
        }
        class B : NameList
        {
    
            public B() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            ~B() => Debug.WriteLine("释放B");
    
        }

    实例化:

              var a = new A
                {
                    Name = "实例后,Name是新赋值"
                };
                a.ID();

    上章 我们说过 实例化A类的时候先会实例化NameListlei,也就是先实例化父类,在实例化子类。而且还是隐式的。

    那么显示是什么样子的呢?

    我们来修改代码:

    注意看A类,B类的 构造函数

      class NameList
        {
            public NameList() => Console.WriteLine("这个是NameList的构造函数");
    
            ~NameList() => Debug.WriteLine("释放NameList");
    
            public string Name { get; set; }
    
            public void ID() => Console.WriteLine($"我的id是{Name}");
        }
    
    
        class A : NameList
        {
    
            public A():base() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            ~A() => Debug.WriteLine("释放A");
        }
        class B : NameList
        {
    
            public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            ~B() => Debug.WriteLine("释放B");
    
        }

    这里 我们使用的Base关键字。

    Base:父类,基类

    使用方式有很多种,但是在子类的构造函数中使用方式是:Base()这个样子的。

    我们先不讨论别的是Base使用方式,还是在构造函数的上面做功夫。

    我们探讨一下 重载构造函数

    我们来修改代码:

    注意AB两个类的重载函数,一个具有Base,一个没有

        class NameList
        {
            public NameList() => Console.WriteLine("这个是NameList的构造函数");
    
            public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}");
    
            ~NameList() => Debug.WriteLine("释放NameList");
    
            public string Name { get; set; }
    
            public void ID() => Console.WriteLine($"我的id是{Name}");
        }
    
    
        class A : NameList
        {
    
            public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}");
    
            ~A() => Debug.WriteLine("释放A");
        }
        class B : NameList
        {
    
            public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数");
    
            public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}");
    
            ~B() => Debug.WriteLine("释放B");
    
        }

    实例化代码:

                var a = new A("ABC");
    
                var b = new B("DEF");

     结果:

     emm,这下子就明白了,重载的构造函数如果不指定Base是不会实例父类的重载函数。只会执行默认的构造函数。注意Base在使用的时候的传参,是直接填入参数。

    子类的重载构造函数实例化时必须要实例化父类的重载构造函数的关键要素有:

    1 父类和子类必须要相同的重载构造函数

    2 子类必须指定Base

    3 传参是实参

  • 相关阅读:
    当tp5项目上传到服务器之后遇见的各种bug(不定期更新)
    解决LAMP下 服务器IP无法访问
    thinkphp5多图上传+同时删除本地文件
    from提交表单后 数据提交到后台 但不跳转页面 非ajax 用iframe
    window7 安装sass和compass
    开源操作系统课程设计
    Hadoop伪分布式搭建实验总结
    排序集合
    快排
    邻接矩阵
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9207857.html
Copyright © 2011-2022 走看看