151 votes

Constructeurs multiples de Dart

Est-il vraiment impossible de créer plusieurs constructeurs pour une classe dans Dart ?

dans ma classe de joueur, si j'ai ce constructeur

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

Puis j'essaie d'ajouter ce constructeur :

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

Je reçois l'erreur suivante :

Le constructeur par défaut est déjà défini.

Je ne cherche pas à trouver une solution de contournement en créant un constructeur avec un tas d'arguments non requis.

Existe-t-il un moyen efficace de résoudre ce problème ?

1 votes

À titre de commentaire sans rapport avec le sujet, vous devriez probablement utiliser des récupérateurs pour color et name pas getColor() et getName() méthodes. Si les valeurs ne changent jamais, vous pouvez utiliser un seul champ public comme class Player { final String name; final int color; Player(this.name, this.color); } .

0 votes

Je suis nouveau sur Dart et pas encore habitué à ce genre de normes, mais merci, je vais essayer.

0 votes

C'est aussi à ce moment-là que l'on se rend compte de tout ce que les débutants ont fait pendant la surcharge des constructeurs de Java/C#... >> "Il faut du temps pour démêler la beauté derrière Java & C# " !

264voto

Günter Zöchbauer Points 21340

Vous ne pouvez avoir qu'un seul anonyme Constructeur mais vous pouvez avoir n'importe quel nombre de nommé constructeurs

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);

Ce constructeur peut être simplifié

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

à

  Player(this._name, this._color);

Les constructeurs nommés peuvent aussi être privés en commençant le nom par _

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

  Player._foo();
}

Constructeurs avec final La liste des initialisations de champs est nécessaire :

class Player {
  final String name;
  final String color;

  Player(this.name, this.color);

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

1 votes

Merci beaucoup ! C'est exactement ce que je cherchais.

11voto

Quentin Points 121

Si votre classe utilise des paramètres finaux, la réponse acceptée ne fonctionnera pas. Cette réponse fonctionne :

class Player {
  final String name;
  final String color;

  Player(this.name, this.color);

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

5voto

Moti Bartov Points 1741

Si vous avez déjà utilisé un constructeur avec des paramètres dans le projet et que vous vous rendez compte que vous avez besoin d'un constructeur par défaut sans paramètres, vous pouvez ajouter un constructeur vide.

class User{
String name;

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

3voto

amitsriv99 Points 51

Essayez le code ci-dessous sur DartPad

class MyClass {
  //These two are private attributes
  int _age;
  String _name;

  //This is a public attribute
  String defaultName = "My Default Name!";

  //Default constructor
  MyClass() {
    _age = 0;
    _name = "Anonymous";
  }

  MyClass.copyContructor(MyClass fromMyClass) {
    this._age = fromMyClass._age;
    this._name = fromMyClass._name;
  }

  MyClass.overloadedContructor(String name, int age) {
    this._age = age;
    this._name = name;
  }

  MyClass.overloadedContructorNamedArguemnts({String name, int age}) {
    this._age = age;
    this._name = name;
  }

  //Overriding the toString() method
  String toString() {
    String retVal = "Name:: " + _name + " | " + "Age:: " + _age.toString();
    return retVal;
  }
}

//The execution starts from here..
void main() {
  MyClass myClass1 = new MyClass();

  //Cannot access oprivate attributes
  //print(myClass1.name);
  //print(myClass1.age);

  //Can access the public attribute
  print("Default Name:: " + myClass1.defaultName);

  print(myClass1.toString());

  MyClass myClass2 = new MyClass.copyContructor(myClass1);

  print(myClass2.toString());

  MyClass myClass3 = new MyClass.overloadedContructor("Amit", 42);

  print(myClass3.toString());

  MyClass myClass4 =
      new MyClass.overloadedContructorNamedArguemnts(age: 42, name: "Amit");

  print(myClass4.toString());
}

2voto

faruk Points 1742

Vous pouvez utiliser constructeurs d'usine

factory Player.fromPlayer(Player another) => Player(another.name, another.color);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X