如何解决接口在Dart源代码中如何在内部工作
如果我在Dart中创建这样的界面:
abstract class MyType {
factory MyType() => MyConcreteSubtype();
void doSomthing();
}
class MyConcreteSubtype implements MyType {
@override
void doSomthing() {
print(42);
}
}
当我运行以下代码时:
final myObject = MyType();
print(myObject.runtimeType); // MyConcreteSubtype
它打印MyConcreteSubtype
。
为什么然后我这样做:
final myList = List();
print(myList.runtimeType); // List<dynamic>
它仍然说是List
吗? List
源代码如下:
abstract class List<E> implements EfficientLengthIterable<E> {
external factory List([int? length]);
// ...
}
除了external
关键字之外,这与我的操作有何不同?当我的界面的运行时类型解析为具体的实现类型时,List
的运行时类型如何仍然假装为List
?具体的List
实现在哪里?在dart:collections
库中,我只能找到抽象类BaseList
和ListMixin
。
解决方法
Dart允许类重写runtimeType
getter。
某些内部特定于平台的实现类型会这样做。例如,VM平台库中有两个或三个不同的实现类来实现int
,但是它们都声称自己的类型为int
。您永远不需要知道它们之间的区别。
我猜您正在网络上运行。 JavaScript编译的代码存在相反的问题:有 zero 个类实现了默认的List
,而是由JavaScript Array
直接表示。因此,没有[].runtimeType
可以为其返回Type
的正确类,而是仅返回了List
本身。这是种作弊行为,但它也是实际(非常不存在)实现中最接近的现有超类。
总而言之,您不应该信任runtimeType
,也不应使用 runtimeType
除dart:mirrors
(在网络上不存在)以外的任何内容)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。