Dlang:为什么不继承构造函数?

Dlang: why are constructors not inherieted?

有没有办法在参数完全相同的情况下不用重复写this(parent class args) {super(parent class args);}

代码:

class Parent {
  string name;

  this(string name) {
    this.name = name;
  }
}

class Child : Parent {
}

unittest {
  auto child = new Child("a name");
  assert(child.name == "a name");
}

https://run.dlang.io/is/YnnezI

给我编译错误:

Error: class onlineapp.Child cannot implicitly generate a default constructor when base class onlineapp.Parent is missing a default constructor

Java 和 C# 也不继承构造函数(除非这在过去几年发生了变化——我认为 C++ 直到 c++11 才允许它),并且 D 遵循相同的推理所以你可以通过查找有关它们的信息来阅读更多内容。

基本上,虽然原因是子classes 必须有自己独特的状态——至少像 vtable 这样的东西,即使你没有声明任何你自己的变量——因此有一个独特的构造函数是必须的。否则你可以有未初始化的成员。

如果继承一直进行下去,因为 Object 有一个 this(),new AnyClass(); 会编译并导致大量无效对象。 (在常规 D 中,如果您声明任何带参数的构造函数,它会禁用自动生成的零参数一。)

现在,D 理论上可以做 C++ 做的事情,也可以自动生成其他参数……但事实并非如此。可能主要是因为这在 C++ 中是一个相对较新的想法,而 D 的 class 系统主要基于 Java 的旧系统。

话虽如此,让我来教你一个技巧:

this(Args...)(auto ref Args args) { super(args); }

将其粘贴到您的子class 中,您基本上一次性继承了父级的所有构造函数。如果 super 没有为给定的 args 编译,这个也不会,所以它也不会添加随机的东西。如果需要,您也可以使用更具体的版本重载它,因此它是内置语言功能的一个合理的小替代品。