Как мне вызвать суперконструктор в Dart? Можно ли вызвать именованные суперконструкторы?
Как мне вызвать суперконструктор в Dart?
Ответы (5)
Да, это так, синтаксис близок к C #, вот пример как с конструктором по умолчанию, так и с именованным конструктором:
class Foo {
Foo(int a, int b) {
//Code of constructor
}
Foo.named(int c, int d) {
//Code of named constructor
}
}
class Bar extends Foo {
Bar(int a, int b) : super(a, b);
}
class Baz extends Foo {
Baz(int c, int d) : super.named(c, d);
}
Если вы хотите инициализировать переменные экземпляра в подклассе, вызов super()
должен быть последним в списке инициализаторов.
class CBar extends Foo {
int c;
CBar(int a, int b, int cParam) :
c = cParam,
super(a, b);
}
Вы можете прочитать о мотивации этого super()
руководства по звонкам на / r / dartlang а>.
Это файл, которым я делюсь с вами, запустите его как есть. Вы узнаете, как вызвать суперконструктор и как вызвать суперпараметрический конструктор.
/ Objectives
// 1. Inheritance with Default Constructor and Parameterised Constructor
// 2. Inheritance with Named Constructor
void main() {
var dog1 = Dog("Labrador", "Black");
print("");
var dog2 = Dog("Pug", "Brown");
print("");
var dog3 = Dog.myNamedConstructor("German Shepherd", "Black-Brown");
}
class Animal {
String color;
Animal(String color) {
this.color = color;
print("Animal class constructor");
}
Animal.myAnimalNamedConstrctor(String color) {
print("Animal class named constructor");
}
}
class Dog extends Animal {
String breed;
Dog(String breed, String color) : super(color) {
this.breed = breed;
print("Dog class constructor");
}
Dog.myNamedConstructor(String breed, String color) : super.myAnimalNamedConstrctor(color) {
this.breed = breed;
print("Dog class Named Constructor");
}
}
Могу ли я вызвать частный конструктор суперкласса?
Да, но только если суперкласс и подкласс, который вы создаете, находятся в одной библиотеке. (Поскольку частные идентификаторы видны во всей библиотеке, в которой они определены). Частные идентификаторы - это те, которые начинаются с подчеркивания.
class Foo {
Foo._private(int a, int b) {
//Code of private named constructor
}
}
class Bar extends Foo {
Bar(int a, int b) : super._private(a,b);
}
случай конструктора с необязательными параметрами
class Foo {
String a;
int b;
Foo({this.a, this.b});
}
class Bar extends Foo {
Bar({a,b}) : super(a:a, b:b);
}
Поскольку dart поддерживает реализацию класса как интерфейса (неявные интерфейсы) , вы не можете вызвать родительский конструктор, если вы реализовали его, вам следует использовать extends. Если вы используете орудия, измените его на расширяет и используйте Решение Эдуардо Копата.