是否可以在 Dart 中切换命名构造函数?
Is it possible to switch named constructors in Dart?
是否可以使用 Animal.dog() 和 Animal.cat() 之类的命名构造函数以及 Animal.specie() 之类的实用命名构造函数来在命名构造函数之间切换?
我想到这个是因为我发现自己在 Widgets 的中间写了长开关,我认为将它隐藏在 class 定义中会更好。可能我在这里缺少一个 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';
}
是的,您可以使用 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
是否可以使用 Animal.dog() 和 Animal.cat() 之类的命名构造函数以及 Animal.specie() 之类的实用命名构造函数来在命名构造函数之间切换?
我想到这个是因为我发现自己在 Widgets 的中间写了长开关,我认为将它隐藏在 class 定义中会更好。可能我在这里缺少一个 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';
}
是的,您可以使用 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