我有以下类和接口(interface):
class Place extends Entity
with ChangeNotifier, FieldGetters
implements Scannable, Likable {
// ...some stuff
}
abstract class Likable {
// ... some stuff
}
Entity
只是其他类的基类。因此,问题在于我想检查实现
Likable
接口(interface)的对象是否属于Place
类。为此,我使用以下代码:logger.i('likable is ${like.likable.runtimeType}');
logger.i('likable is Place: ${like.likable is Place}');
第一行按预期工作,并显示以下输出:
I/flutter ( 1635): [38;5;12m┌───────────────────────────────────────────────────────────────────────────────[0m
I/flutter ( 1635): [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄[0m
I/flutter ( 1635): [38;5;12m│ 💡 likable is Place[0m
I/flutter ( 1635): [38;5;12m└───────────────────────────────────────────────────────────────────────────────[0m
但是,第二行代码很奇怪,并显示以下内容:
I/flutter ( 1635): [38;5;12m┌───────────────────────────────────────────────────────────────────────────────[0m
I/flutter ( 1635): [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄[0m
I/flutter ( 1635): [38;5;12m│ 💡 likable is Place: false[0m
I/flutter ( 1635): [38;5;12m└───────────────────────────────────────────────────────────────────────────────[0m
官方文档建议可以通过
is
关键字检查接口(interface)继承。我很困惑。在这种情况下,如何检查接口(interface)继承?Dart :
v2.8.1
Flutter :
v1.17.0
最佳答案
在Dart中,一个类只能从一个父类(super class)继承(对于Place
,它是Entity
),而implement
则可以从多个父类(super class)继承(即,从这些类中获取函数)。
据我从您的描述中可以理解,您正在执行类似的操作(可以运行here)。
class Person extends LivingCreature implements Mammal{
final _name;
void _toDrinkMilk(){
print("I drink milk as a person!");
}
Person(this._name);
}
class Mammal {
void _toDrinkMilk(){
print("I drink milk!");
}
}
class LivingCreature {
void _toLive(){
print("I live!");
}
}
void main() {
final bob = Person('Bob');
final mammal = Mammal();
print(mammal is LivingCreature);
print(bob.runtimeType);
bob._toDrinkMilk();
bob._toLive();
print('Bob is mammal: ${bob is Mammal}');
print('Mammal is Person: ${mammal is Person}');
}
此代码产生以下输出:
true
Person
I drink milk as a person!
I live!
Bob is mammal: true
Mammal is Person: false
因此,现在让我们讨论一下您的情况,您的
like.likable
应该是Likable
抽象类(我假设)。 Place
同时实现Likable
,因此它应该实现Likable
的所有方法。现在,您尝试询问Dart的
Likable
(不会扩展或实现任何内容)的类型是Place
,这是日志中给定的false
。如果已经是
class Likable extends Place {...
,那么在日志中,您将like.likable is Place
等于true
有关扩展,实现的更多信息,可以引用Dart docs
附言我没有制作哺乳动物抽象来在print()中快速实例化它
希望能帮助到你!