Дарт кілька конструкторів


80

Невже неможливо створити кілька конструкторів для класу в дротику?

у моєму класі Player, якщо у мене є цей конструктор

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

Потім я намагаюся додати цей конструктор:

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

Я отримую таку помилку:

Конструктор за замовчуванням вже визначений.

Я не шукаю обхідного шляху, створюючи один конструктор з купою необов’язкових аргументів.

Чи є хороший спосіб вирішити це?


1
Як не пов’язаний коментар, ви, ймовірно, повинні використовувати геттери для colorі name, а не getColor()і getName()методів. Якщо значення ніколи не змінюються, ви можете використовувати одне загальнодоступне поле, наприклад class Player { final String name; final int color; Player(this.name, this.color); }.
lrn

Я новачок у дротику і ще не звик до таких стандартів, але, дякую, спробую.
Том Порат,

Це також тоді, коли ви усвідомлюєте, що робили всі новачки під час перевантаження Java / C # Constructor ... >> "Потрібен час, щоб розгадати красу Java & C #"!
Yo Apps

Відповіді:


154

Ви можете мати лише один безіменний конструктор , але ви можете мати будь-яку кількість додаткових іменованих конструкторів

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

Цей конструктор можна спростити

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

до

  Player(this._name, this._color);

Іменовані конструктори також можуть бути приватними, починаючи ім'я з _

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

  Player._foo();
}

finalПотрібні конструктори зі списком ініціалізатора полів:

class Player {
  final String name;
  final String color;

  Player(this.name, this.color);

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

1
Дуже дякую! Саме те, що я шукав.
Том Порат,

5

Якщо ваш клас використовує кінцеві параметри, прийнята відповідь не буде працювати. Це робить:

class Player {
  final String name;
  final String color;

  Player(this.name, this.color);

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

2

Якщо ви вже використовували конструктор з параметрами в проекті, і тепер ви зрозуміли, що вам не потрібен жоден конструктор параметрів за замовчуванням, ви можете додати порожній конструктор.

class User{
String name;

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

1

Спробуйте наведений нижче код на 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());
}


-1

Як уже сказав @ Günter Zöchbauer

Ви можете мати лише один безіменний конструктор, але ви можете мати будь-яку кількість додаткових іменованих конструкторів у Flutter.

  • За допомогою іменованого конструктора ви можете створити кілька конструкторів в одному класі.
  • Кожен конструктор матиме унікальну назву. Щоб ви могли ідентифікувати кожного з них.

Синтаксис для іменованого конструктора :

class_name.constructor_name (arguments) { 
   // If there is a block of code, use this syntax

   // Statements
}

or

class_name.constructor_name (arguments); 
   // If there is no block of code, use this syntax

Для отримання додаткової інформації натисніть тут

Щоб знати про різні типи конструкторів у Flutter Клацніть тут


-1

Як щодо випадку, коли ви хочете мати більше одного конструктора. Наприклад, є 2 конструктори, які ви бажаєте використовувати:

Customer(String name, int age, String location) {
  this.name = name;
  this.age = age;
  this.location = location;
}

Customer(this.name, this.age) {
  this.name = name;
  this.age = age;
}

Але якщо ви визначите їх обох у класі, буде помилка компілятора.

Dart пропонує конструктор Named, який допоможе вам реалізувати кілька конструкторів з більшою чіткістю:

class Customer {
  // ...

  Customer(String name, int age, String location) {
    this.name = name;
    this.age = age;
    this.location = location;
  }

  // Named constructor - for multiple constructors
  Customer.withoutLocation(this.name, this.age) {
    this.name = name;
    this.age = age;
  }

  Customer.empty() {
    name = "";
    age = 0;
    location = "";
  }

  @override
  String toString() {
    return "Customer [name=${this.name},age=${this.age},location=${this.location}]";
  }
}

Ви можете написати це простіше із синтаксичним цукром:

Customer(this.name, this.age, this.location);

Customer.withoutLocation(this.name, this.age);

Customer.empty() {
  name = "";
  age = 0;
  location = "";
}

Тепер ми можемо створити новий Customerоб’єкт цими методами.

var customer = Customer("bezkoder", 26, "US");
print(customer);
// Customer [name=bezkoder,age=26,location=US]

var customer1 = Customer.withoutLocation("zkoder", 26);
print(customer1);
// Customer [name=zkoder,age=26,location=null]

var customer2 = Customer.empty();
print(customer2);
// Customer [name=,age=0,location=]

Отже, чи є спосіб зробити Customer.empty()охайним? І як ініціалізувати порожнє значення поля розташування при виклику Customer.withoutLocation()замість null?

Від: Кілька конструкторів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.