有没有办法不用重复写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 遵循相同的推理,因此您可以通过查找内容来阅读更多内容关于他们。
基本上,虽然原因是子类必须有自己独特的状态——至少像 vtable 这样的东西,即使你没有声明任何自己的变量——因此需要一个独特的构造函数。否则,您可能会有未初始化的成员。
如果继承是完整的,因为 Object 有一个 this(),new AnyClass();
会编译并导致很多无效的对象。 (在常规 D 中,如果您声明任何带参数的 ctor,它会禁用自动生成的零参数一。)
现在,D 理论上可以做 C++ 所做的事情,并且也可以自动生成其他参数……但事实并非如此。可能主要是因为这是 C++ 中的一个相对较新的想法,而 D 的类系统主要基于 Java 的旧系统。
话虽如此,让我向您展示一个技巧:
this(Args...)(auto ref Args args) { super(args); }
把它放在你的子类中,你基本上可以一次性继承所有父类的构造函数。如果 super 没有为给定的 args 编译,这也不会,所以它也不会添加随机的东西。如果需要,您也可以使用更具体的版本重载它,因此它是内置语言功能的合理替代品。
关于oop - Dlang : why are constructors not inherieted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58679456/