Как мне вызвать суперконструктор в Dart?

Как мне вызвать суперконструктор в Dart? Можно ли вызвать именованные суперконструкторы?


person Eduardo Copat    schedule 07.11.2012    source источник


Ответы (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 .

person Eduardo Copat    schedule 07.11.2012

Это файл, которым я делюсь с вами, запустите его как есть. Вы узнаете, как вызвать суперконструктор и как вызвать суперпараметрический конструктор.

/ 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");
    }
}
person Soban Arshad    schedule 23.05.2019

Могу ли я вызвать частный конструктор суперкласса?

Да, но только если суперкласс и подкласс, который вы создаете, находятся в одной библиотеке. (Поскольку частные идентификаторы видны во всей библиотеке, в которой они определены). Частные идентификаторы - это те, которые начинаются с подчеркивания.

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);
}
person user7610    schedule 07.12.2014

случай конструктора с необязательными параметрами

class Foo {
  String a;
  int b;
  Foo({this.a, this.b});
}

class Bar extends Foo {
  Bar({a,b}) : super(a:a, b:b);
}
person ikamaru    schedule 26.12.2020
comment
В вашем конструкторе Bar параметры «a» и «b» имеют динамический тип. Вы упустили преимущества статически типизированного языка. - person Piotr Temp; 29.12.2020

Поскольку dart поддерживает реализацию класса как интерфейса (неявные интерфейсы) , вы не можете вызвать родительский конструктор, если вы реализовали его, вам следует использовать extends. Если вы используете орудия, измените его на расширяет и используйте Решение Эдуардо Копата.

person Bachiri Taoufiq Abderrahman    schedule 09.04.2018