我有以下类和接口(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()中快速实例化它

希望能帮助到你!

08-05 11:15