不是很理解这一句:"第二,基类的构造方法不会被继承,在派生类中需要我们重新定义新的构造方法"

来源:4-7 【操作】构造函数的继承

rickey_gong

2022-12-20

"阿老师"你好,您在4-7构造函数继承中提到的:

对于构造方法的继承,有两点需要我们留意。第一,在初始化一个对象的时候,基类base
class的构造方法总是会首先运行。第二,基类的构造方法不会被继承,在派生类中需要我们重新定义新的构造方法。

其中我不是很理解这一句:"第二,基类的构造方法不会被继承,在派生类中需要我们重新定义新的构造方法"
像我下面的代码,派生类什么也没干(没有重新定义新的构造方法,仅继承了基类),还是会打印员工类初始化呀,是不是应该怎么说?基类的 [有参构造方法] 不会被继承,在派生类中需要我们重新定义新的构造方法。

namespace _4_7构造函数的继承
{
    class Program
    {
        public class Staff
        {
            public Staff()
            {
                Console.WriteLine("员工类初始化");
            }
            public int Number { get; set; }
            public Staff(int number)
            {
                Number = number;
            }
        }
        public class Manager : Staff
        {

        }
        static void Main(string[] args)
        {
            Manager manager = new Manager();
            Console.Read();
        }
    }
}

以上

写回答

1回答

阿莱克斯刘

2022-12-21

基类的构造方法不会被继承”的提法是没有错的。而且,不仅“构造方法”无法继承,包括“析构函数”、“赋值操作符”等等方法也同样是不能被继承的;更进一步来说,不光是C#的构造方法无法被继承,包括c++、java等语言的构造方法也都无法被继承。

那为什么你的代码中Manager类啥都不干还能打印Staff类的构造方法的内容呢?

首先,回答我一个问题,Manager类有没有Staff()这个方法?答案是没有,Manager类没有Staff()方法,它只有Manager()方法。Manager() 才是Manager类的构造方法,既然没有Staff()方法,哪里会有构造方法继承(准确来说是override)的关系呢?

第二,在定义一个类的时候,如果构造方法没有参数,那么这个构造方法是可以省略的。

第三,被省略的构造方法其实长这样,代码中的base()就是父类的构造方法。

public class Manager : Staff        
{
    public Manager():base()
    {
    }
}

当我们在new一个manager的时候,manager类的构造方法Manager()会调用base(),所以你就看到“员工类初始化”被输出了。

所以,Manager构造方法和Staff构造方法不存在继承和重写的关系,他们之间存在的是“调用”关系。

参考资料:基类的构造函数不能被派生类继承? - 知乎 (zhihu.com)

java构造器为什么不能被继承_大数据男的博客-CSDN博客_构造器为什么不能被继承

0
1
rickey_gong
阿老师的一番话令我茅塞顿开
2022-12-23
共1条回复

C#速成指南--从入门到进阶,实战WPF与Unity3D开发

系统掌握C#核心和应用,获得全行业适配的技能

839 学习 · 198 问题

查看课程