根据输入类型执行特定的代码

时间:2019-05-31 20:42:30

标签: dart

我需要一个函数,该函数接受父类的所有子类,此函数将检查接收到的参数的类型,然后对其执行某些特定操作,如下所示:

class Animal {
  String sound;
}

class Cat extends Animal {
  String sound = 'Meow';
}

class Dog extends Animal {
  final String sound = 'Roof';
  final String somePropertyOnlyDogHave = 'Best friend';
}

void foo<T extends Animal>(T animal) {
  print(T.runtimeType);
  switch(T) {
    case Cat:
      print(animal.sound);
      break;
    case Dog:
      print(animal.sound);
      print(animal.somePropertyOnlyDogHave);
      break;
    default:
      print('No match');
  }
}

上面的代码无法编译,因为未在父类上定义somePropertyOnlyDogHave
如何在不必在父类上定义somePropertyOnlyDogHave的情况下实现此功能?

2 个答案:

答案 0 :(得分:3)

考虑将 if / else is运算符一起使用,而不是 switch / case

void foo<T extends Animal>(T animal) {
  print(T.runtimeType);
  if (animal is Cat) {
    print(animal.sound);
  } else if (animal is Dog) {
    print(animal.sound);
    print(animal.somePropertyOnlyDogHave);
  } else {
    print('No match');
  }
}

使用此语法,Dart在animal范围内将Dog推断为if

答案 1 :(得分:0)

您可以将animal强制转换为Dog大小写,例如:

    case Dog:
      Dog dog = animal;
      print(dog.sound);
      print(dog.somePropertyOnlyDogHave);
      break;