Дланг: почему конструкторы не наследуются? - PullRequest
2 голосов
/ 03 ноября 2019

Есть ли способ не писать неоднократно 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

1 Ответ

7 голосов
/ 03 ноября 2019

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); }

вставьте это в свой подкласс, и вы в основном наследуете все конструкторы родителя за один раз. Если супер не компилируется для заданных аргументов, то и этого не будет, поэтому он также не добавляет случайных вещей. Вы также можете перегрузить его более конкретными версиями, если это необходимо, так что это разумная небольшая замена встроенной языковой функции.

...