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 传参是实参

posted @   ARM830  阅读(223)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示