这个问题可能源于对Dart中对OOP的理解不足,但无论如何:
我一直在从事一个项目,我的一个基础类从ListBase
扩展了dart:collections
。在某些情况下,能够获得这些类似List的对象的排序索引很有用(实际上没有对其进行排序)。
作为父类,我有类似的东西(大大简化了):
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
的实例具有[1, 5, 2, 4, 3]
作为其internalList
,则orderedIndices
将按预期返回[0, 2, 4, 3, 1]
。
但是,我想将实现orderedIndices
的代码放入类A
的定义中,因为只要A
的任何后代都相同,指定的类型T
是Comparable
(即定义了compareTo
)。但是我不知道该怎么做,因为在不知道类型T
的情况下,Dart无法知道T
实例是否确实是Comparable
并在{{1}咳嗽},如果我尝试将代码放入compareTo
的定义中。
尽管可以工作,但我不赞成将代码复制粘贴到同一类的后代中。...有什么办法可以使我在A
的定义中告诉Dart {{1 }}将是A
?
答案 0 :(得分:1)
如果要将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
作为实现。