web-dev-qa-db-ja.com

Dartでスーパーコンストラクターを呼び出すにはどうすればよいですか?

Dartでスーパーコンストラクターを呼び出すにはどうすればよいですか?名前付きスーパーコンストラクターを呼び出すことは可能ですか?

50
Eduardo Copat

はい、そうです、構文は 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);
}
_

/ r/dartlang のこのsuper()呼び出しガイドラインの背後にある動機について読むことができます。

67
Eduardo Copat

スーパークラスのプライベートコンストラクターを呼び出すことはできますか?

はい。ただし、作成するスーパークラスとサブクラスが同じライブラリにある場合のみです。 (プライベート識別子は、定義されているライブラリ全体で表示されるため)。プライベート識別子は、アンダースコアで始まる識別子です。

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

Dartはクラスをインターフェイスとして実装することをサポートしているため( Implicit interfaces )、implementedの場合、親コンストラクタを呼び出すことはできませんextendsを使用する必要があります。 implementsを使用する場合は、extendsに変更し、Eduardo Copatのソリューションを使用します。

これは私があなたと共有しているファイルで、そのまま実行します。スーパーコンストラクターを呼び出す方法と、スーパーパラメーター化されたコンストラクターを呼び出す方法を学習します。

/ 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");
    }
}
1
Soban Arshad