oop - Dlang : why are constructors not inherieted?

标签 oop inheritance constructor compilation d

有没有办法不用重复写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/

相关文章:

c# - 从 C# 中的基类获取派生类型?

java - java中继承的问题

java - Xstream 无参数构造函数错误

dictionary - 如何使用 dart Map.fromEntries() 构造函数?

javascript - 如何在javascript中获取某个类的所有静态成员的列表

c++ - 在 C++ 的基类构造函数中构造派生类

java - 里氏代换原则——如何建模正方形和长方形

Python:如何创建 "global object"?

C++ 错误 C2511 : overloaded member function not found in 'Sprite'

c++ - VS2013 Unresolved External with 构造函数和析构函数