oop - 在 Dart 中将类型定义为“Comparable”
问题描述
这个问题可能源于对 Dart 中的 OOP 理解不足,但无论如何:
我一直在做一个项目,我的一个基类ListBase
从dart:collections
. 在某些情况下,我遇到能够获得这些类似列表的对象的排序索引(而不实际对它们进行排序)是很有用的。
作为父类,我有类似的东西(高度简化):
abstract class A<T> extends ListBase<T> {
List<T> internalList;
List<int> orderedIndices();
...
}
一个示例后代类似于:
class B extends A<num> {
...
@override
List<int> orderedIndices() => new List<int>.generate(
internalList.length,(i) => i)..sort(
(i, j) => internalList[i].compareTo(internalList[j]));
}
例如,如果B
has [1, 5, 2, 4, 3]
as its internalList
then的实例将按预期orderedIndices
返回[0, 2, 4, 3, 1]
。
但是,我想将实现的代码orderedIndices
放入 class的定义中,因为只要指定的类型是(即已定义)A
,它在任何后代中都是相同的。但是,我不知道如何做到这一点,因为在不知道 type 的情况下,Dart 无法知道实例是否确实存在,并且如果我尝试将代码放入's 定义中,就会咳嗽。A
T
Comparable
compareTo
T
T
Comparable
compareTo
A
虽然它会起作用,但我反对将代码复制并粘贴到同一类的后代中的想法......有什么方法可以告诉 Dart 在我的定义A
中将T
是一个Comparable
?
解决方案
如果您想限制T
为A
可比较的类型。这是通过设置界限来完成的T
:
abstract class A<T extends Comparable<T>> extends ListBase<T> {
...
List<int> orderedIndices() => new List<int>.generate(
internalList.length,(i) => i)..sort(
(i, j) => internalList[i].compareTo(internalList[j]));
...
如果不是所有版本A
都具有可比性,那么您就不能这样做。然后你可以创建一个辅助子类,A
它是:
abstract class ComparableA<T extends Comparable<T>> extends A<T> {
List<int> orderedIndices() => new List<int>.generate( ....
...
}
然后,您可以class B extends ComparableA<num> ...
在可能的情况下共享比较行为,A
直接扩展的类将需要自己实现该方法。
最后,您可以将您的规范更改orderedIndices
为:
List<int> orderedIndics(int Function(T, T) compare) {
return List.generate(internalList.length,(i) => i)..sort(
(i, j) => compare(internalList[i], internalList[j]));
}
然后您可以选择每次调用如何比较internalList
. 如果T
是Comparable
,则可以Comparable.compare
用作实现。
推荐阅读
- java - 硒问题尝试使用 driver.findElement(By.xpath() 从 div 检索文本
- r - 根据其他两个列值计算行数,并通过 R 中的这些列值之一循环操作该值
- nativescript - 不能在 nativescript 游乐场中使用 vuex(npm 包)
- javascript - 如何在 Google Play 商店中直接打开网页链接
- reactjs - 找不到模块'@babel/plugin-transform-runtime'
- angular - 角度 - 在 rxjs 订阅等待数据时显示加载
- c# - 互操作错误 HRESULT:服务器上的 0x80020005 (DISP_E_TYPEMISMATCH)
- c++ - contains 不是 std::map MSVC 的成员
- excel - INDEX MATCH 有 2 个条件,匹配部分文本
- ios - 更新终端后 Pod init 无法正常工作(一些弹出窗口变为 ZSH)