Дарт - Абстрактные конструкторы - PullRequest
0 голосов
/ 03 октября 2019

Скажем, у меня есть абстрактный класс A

abstract class A {
  A.someConstructor(Foo foo);
}

, и все подклассы A должны затем реализовать такой конструктор:

class B extends A {
  @override
  B.someConstructor(Foo foo) {
    // ...
  }
}

Так что в основном я хочу использовать некие абстрактные конструкторы.

Есть ли способ добиться этого (конечно, вышеприведенный код не работает) или мне нужен обычный абстрактный метод, который затем создает объект и устанавливает его свойства?

РЕДАКТИРОВАТЬ:Итак, похоже, что единственный способ создать хотя бы похожее поведение было бы примерно таким:

abstract class A {
  A.someConstructor(Object foo);
}

class B extends A {
  B.someConstructor(Object foo) : super.someConstructor(foo) {
    // ...
  }
}

Это не совсем полезно, и, подумав о моей проблеме, я понял, что на самом деле мойСама первоначальная цель на самом деле не является необходимой, поэтому на эти вопросы теперь есть ответы.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вы хотите применить шаблон к конструкторам подклассов. Язык Дарт не поддерживает этого.

Дарт имеет типы и интерфейсы , которые можно использовать для ограничения значений и членов экземпляров класса.

Если класс реализует интерфейс, то его члены instance должны удовлетворять сигнатурам, объявленным суперинтерфейсом. Это ограничивает элементы экземпляра.

Если переменная имеет тип, например тип функции, то вы можете назначать ей только значения этого типа. Это ограничивает значения . Поскольку класс является подтипом его интерфейсов, ограничение подкласса означает, что типизированные переменные класса можно безопасно использовать (подтип можно использовать как его супертип, поскольку он имеет совместимый интерфейс).

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

В этой ситуации ваши подклассы должны вызвать конструктор A.someConstructor, но они могут свободно выбирать подпись своегособственные конструкторы. Они могут сделать:

class B extends A {
  B.someConstructor(Object foo) : super.someConstructor(foo);
}
// or
class C extends A {
  C.differentName(Object foo) : super.someConstructor(foo);
}
// or even
class D extends A {
  C() : super.someConstructor(new Object());
}
0 голосов
/ 03 октября 2019

Конструкторы не наследуются

Подклассы не наследуют конструкторы от своего суперкласса. У подкласса, который не объявляет конструкторов, есть только конструктор по умолчанию (без аргумента, без имени).

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...