是否有可能有像 Animal.dog() 和 Animal.cat() 這樣的資料化命名建構式和一個像 Animal.specie() 這樣的名為建構式的實用程式,用于在資料化命名建構式之間切換?
我想出這個是因為我發現自己在 Widgets 的中間寫了很長的開關,我認為把它隱藏在類定義中會更好。可能我在這里遺漏了一個 OOP 概念,所以如果我沒有看到更簡單的解決方案,請告訴我。
enum AnimalsEnum { dog, cat }
class Animal {
final int age;
final String data;
final AnimalsEnum specie;
Animal(this.age, this.data, this.specie);
Animal.bySpecie(this.age, this.specie) {
switch (specie) {
case AnimalsEnum.dog:
this = Animal._dog(this.age); // Does not work
break;
case AnimalsEnum.cat:
this = Animal._cat(this.age); // Does not work
break;
}
}
Animal._dog(this.age)
: specie = AnimalsEnum.dog,
data = 'Dogs love Flutter';
Animal._cat(this.age)
: specie = AnimalsEnum.cat,
data = 'Cats love pasta';
}
uj5u.com熱心網友回復:
是的,您可以使用factory建構式輕松獲得此結果。
代碼
class Animal {
final int age;
final String data;
final AnimalsEnum specie;
Animal({required this.age, required this.data, required this.specie});
factory Animal.dog(int age) {
return Animal(
age: age,
data: 'Dogs love Flutter',
specie: AnimalsEnum.dog,
);
}
factory Animal.cat(int age) {
return Animal(
age: age,
data: 'Cats love pasta',
specie: AnimalsEnum.cat,
);
}
factory Animal.bySpecie({
required int age,
required AnimalsEnum specie,
}) {
switch (specie) {
case AnimalsEnum.dog:
return Animal.dog(age);
case AnimalsEnum.cat:
return Animal.cat(age);
}
}
}
例子
void main() {
final cat = Animal.cat(1);
final dog = Animal.dog(2);
final specie = Animal.bySpecie(age: 3, specie: AnimalsEnum.cat);
print('${cat.age} - ${cat.data} - ${cat.specie}');
print('${dog.age} - ${dog.data} - ${dog.specie}');
print('${specie.age} - ${specie.data} - ${specie.specie}');
}
輸出
1 - Cats love pasta - AnimalsEnum.cat
2 - Dogs love Flutter - AnimalsEnum.dog
3 - Cats love pasta - AnimalsEnum.cat
在 DartPad 上試試這個例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367089.html
