是否可以在 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

Try the example on DartPad