Dlang:为什么不使用构造函数?

问题描述 投票:2回答:1

当参数完全相同时,是否有一种不必重复写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
oop inheritance constructor compilation d
1个回答
6
投票

Java和C#也不继承构造函数(除非最近几年发生了变化-我认为C ++直到c ++ 11才允许这样做),D遵循相同的推理,因此您可以通过阅读以下内容来了解​​更多内容关于他们的事情。

基本上,原因是子类必须具有自己的唯一状态-即使您未声明任何自己的变量,至少也要像vtable这样的东西-因此需要唯一的构造函数。否则,您可以具有未初始化的成员。

并且如果继承是全部过程,由于Object具有this(),new AnyClass();将编译并导致很多无效的对象。 (在常规D中,如果您使用参数声明任何ctor,它将禁用自动生成的零arg one。)

现在,D在理论上可以做C ++的工作,并且也可以自动生成其他args ...只是不行。可能主要是因为在C ++中这是一个相对较新的想法,D的类系统主要基于Java的旧系统。

但是所有这些,让我给你展示一个把戏:

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

将其保留在您的子类中,基本上可以一次继承所有父级的构造函数。如果super不针对给定的args进行编译,则也不会这样做,因此也不会添加随机数。如果需要,您也可以使用更特定的版本来重载它,因此,它几乎可以替代内置语言功能。

© www.soinside.com 2019 - 2024. All rights reserved.