不是很理解这一句:"第二,基类的构造方法不会被继承,在派生类中需要我们重新定义新的构造方法"
来源: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回答
-
“基类的构造方法不会被继承”的提法是没有错的。而且,不仅“构造方法”无法继承,包括“析构函数”、“赋值操作符”等等方法也同样是不能被继承的;更进一步来说,不光是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构造方法不存在继承和重写的关系,他们之间存在的是“调用”关系。
012022-12-23
相似问题