gpt4 book ai didi

types - Dart 中的接口(interface)约束

转载 作者:行者123 更新时间:2023-12-03 03:28:06 25 4
gpt4 key购买 nike

我正在将我的一个库从 Ruby 移植到 Dart,以感受一下这门语言,到目前为止一切进展顺利。语言感觉还可以,没有太多粗糙的边缘。现在考虑到 Dart 是可选类型的,我可以给所有的东西一个动态类型并称之为一天,但这有点毫无意义。所以我一直在尽可能地添加类型,但有几个地方我不太清楚该怎么做。基本问题非常简单。我正在使用基本上具有以下界面的对象

abstract class Indexable {
Matchable operator [](int index);
}

abstract class Matchable {
bool operator ==(dynamic other);
}

现在几乎所有东西都支持 Matchable但并非所有内容都支持 Indexable尽管理论上很多事情都可以做到。做明显的事情是行不通的。我不能只用 as 进行类型转换因为我的测试表明 StringList当我尝试将它们强制转换为 Indexable 时抛出异常.我能想到的其他解决方案是包装器和反射,但两者都感觉像 hack,并添加了一大堆不必要的样板,因为 StringList已经实现了相关的算子。

我想象的用例的一些伪代码

List<Matchable> matches(Indexable sequence, List<Matchable> matchers) {
int index = 0;
Matchable element;
List<Matchable> accumulator = [];

while ((element = sequence[index++]) != null) {
if (matchers.any((m) => m == element)) {
accumulator.add(element);
}
}

return accumulator;
}

最佳答案

如果您想对不与其中的操作共享接口(interface)的类使用“通用”操作,则需要使用 dynamic作为类型或在你使用它的地方进行动态类型检查if (x is String) something(x[index]); else if (x is List) ... .

Dart 曾经有一个类型叫做 Sequence<T>T operator[](int index)int get length作为界面。那是因为我们觉得它没有自己的重量,所以被删除了。实际上只有两个实现,ListString ,而 String 恰好匹配更像是一个意外 - 不建议在 String 上使用 [] 运算符,因为它会破坏代理对。

在您的情况下,我只是将 List 用于 Indexable,并忽略 String 恰好也是 Indexable 的,除非原始程序依赖于此。

关于types - Dart 中的接口(interface)约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com