我需要一个函数,该函数接受父类的所有子类,此函数将检查接收到的参数的类型,然后对其执行某些特定操作,如下所示:
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
的情况下实现此功能?
答案 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;