c# - 为什么我们必须将值从派生类构造函数传递给基类构造函数
问题描述
namespace Sample
{
public class Program
{
static int x;
public Program(int Y) {
x = Y;
Console.WriteLine("one value base class constructor called");
}
static void Main(string[] args)
{
Program prog = new s(10);
Console.ReadKey();
}
}
public class s: Program {
public s(int k):base(10)
{
Console.WriteLine("derived class constructor called");
}
}
}
为什么要先调用基类构造函数?如果我在基类中定义了参数化构造函数,那么派生类构造函数必须将值从派生类传递给基类构造函数。
我想知道为什么它是强制性的?如果没有值传递给基类构造函数,则编译器会给出错误消息“没有给出与所需形式参数相对应的参数”。
我不是在问我是否必须将值传递给基类,但我的问题是为什么我必须这样做?为什么要首先调用基类构造函数?
解决方案
您已经回答了自己的问题:
众所周知,基类构造函数是在派生类构造函数之前调用的。
由于您的基类只有一个必须接受参数的构造函数,因此您必须在调用它时提供此参数。
如果你的基类有一个无参数的构造函数,那么编译器会很高兴public s(int k):base()
,甚至只是public s(int k)
(因为base()
将在编译时隐式添加)。
但是,由于您明确为 class 编写了构造函数Program
,编译器不提供默认的无参数构造函数,因此实例化Program
类的唯一方法是调用它的唯一构造函数并传递相关参数。
推荐阅读
- python - 使用 pytest skipif 检查服务器的内存大小
- python - 提交订单并重定向到单个平台
- python - 使用 Flask 的增量作业队列(获取部分结果)
- json - json 日志格式的流利位解析器问题
- freertos - FreeRTOS 中“taskENTER_CRITICAL()”的 CMSIS API
- spring - 拆分后的条件流
- laravel - 数组返回 0 但不返回 1
- c# - 如何通过在 C# 中保留原始路径的目录分隔符来组合路径?
- javascript - 在下拉列表中更改输入类型 ='时间'
- java - 在 Spring Embedded LDAP 中存储二进制项