webentwicklung-frage-antwort-db.com.de

Dart mehrere Konstruktoren

Ist es wirklich nicht möglich, mehrere Konstruktoren für eine Klasse in Dart zu erstellen?

in meiner Spielerklasse, wenn ich diesen Konstruktor habe

Player(String name, int color) {
    this._color = color;
    this._name = name;
}

Dann versuche ich diesen Konstruktor hinzuzufügen:

Player(Player another) {
    this._color = another.getColor();
    this._name = another.getName();
}

Ich erhalte folgende Fehlermeldung: 

Der Standardkonstruktor ist bereits definiert.

Ich bin nicht auf der Suche nach einer Problemumgehung, indem ich einen Konstruktor mit einer Reihe nicht erforderlicher Argumente erstellt habe. 

Gibt es einen schönen Weg, um das zu lösen?

13
Tom Porat

Sie können nur einen unbenanntenKonstruktor haben, aber Sie können eine beliebige Anzahl zusätzlicher named - Konstruktoren haben.

class Player {
  Player(String name, int color) {
    this._color = color;
    this._name = name;
  }

  Player.fromPlayer(Player another) {
    this._color = another.getColor();
    this._name = another.getName();
  }  
}

new Player.fromPlayer(playerOne);

Dieser Konstruktor kann vereinfacht werden

  Player(String name, int color) {
    this._color = color;
    this._name = name;
  }

zu

  Player(this._name, this._color);

Benannte Konstruktoren können auch privat sein, indem Sie den Namen mit _ beginnen. 

class Player {
  Player._(this._name, this._color);

  Player._foo();
}
27

Wenn Sie bereits einen Konstruktor mit Params im Projekt verwendet haben und nun herausgefunden haben, dass Sie keinen Standardkonstruktor für Params benötigen, können Sie einen leeren Konstruktor hinzufügen.

class User{
String name;

   User({this.name}); //This you already had before
   User.empty(); //Add this later 
}
1
Moti Bartov

Wenn Ihre Klasse endgültige Parameter verwendet, funktioniert die akzeptierte Antwort nicht. Das macht:

class Player {
  final String name;
  final String color;

  Player(this.name, this.color);

  Player.fromPlayer(Player another) :
    color = another.color,
    name = another.name;
}
0
Quentin