Oop 在Dart中将类型定义为“可比较”

Oop 在Dart中将类型定义为“可比较”,oop,dart,Oop,Dart,这个问题可能源于对Dart中OOP的理解不足,但无论如何: 我一直在做一个项目,我的一个基类从dart:collections扩展了ListBase。在我遇到的某些情况下,能够获得这些类似列表的对象的排序索引(而无需实际排序)非常有用 作为一个父类,我有如下内容(高度简化): 抽象类A扩展了ListBase{ 名单; 列出有序的数据项(); ... } 示例子体类似于: class B extends A<num> { ... @override List<i

这个问题可能源于对Dart中OOP的理解不足,但无论如何:

我一直在做一个项目,我的一个基类从
dart:collections
扩展了
ListBase
。在我遇到的某些情况下,能够获得这些类似列表的对象的排序索引(而无需实际排序)非常有用

作为一个父类,我有如下内容(高度简化):

抽象类A扩展了ListBase{
名单;
列出有序的数据项();
...
}
示例子体类似于:

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类扩展了A类{
...
@凌驾
List orderedIndices()=>new List.generate(
internalList.length,(i)=>i)…排序(
(i,j)=>internalList[i]。compareTo(internalList[j]);
}
例如,如果
B
的实例将
[1,5,2,4,3]
作为其
内部列表
,则
orderedDices
将按预期返回
[0,2,4,3,1]

但是,我想将实现
orderedDices
的代码放入类
A
的定义中,因为只要指定的类型
T
可比的
(即定义了
compareTo
),它在
A
的任何后代中都是相同的。然而,我不知道如何做到这一点,因为在不知道类型
t
的情况下,Dart无法知道
t
实例是否确实是
可比的
,如果我试图将代码放入
A
的定义中,Dart会对
比较对象发出咳嗽


虽然它会起作用,但我对将代码复制并粘贴到同一类的后代中的想法犹豫不决。。。在我对
A
的定义中,有什么方法可以告诉Dart
T
将是一个
可比的

如果要将
A
T
限制为可比较的类型。这是通过在
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]));
  ...
然后您可以在可能的情况下执行
class B extends compariablea…
以共享比较行为,而直接扩展
A
的类将需要自己实现该方法

最后,您可以将
orderedDices
的指定更改为:

List<int> orderedIndics(int Function(T, T) compare) {
  return List.generate(internalList.length,(i) => i)..sort(
      (i, j) => compare(internalList[i], internalList[j]));
}
List orderedinics(int函数(T,T)比较){
返回List.generate(internalList.length,(i)=>i)…排序(
(i,j)=>比较(内部列表[i],内部列表[j]);
}

然后,您可以选择每次调用如何比较
internalList
的元素。如果
T
compariable
,您可以使用
compariable.comparize
作为实现。

知道
T
是compariable有什么好处?排序是在
T
compareTo
中实现的。要获得预期的结果,您需要一个不同的
比较来实现
——在上面的示例中,类型
int
的实现是不同的,这是不可能的。@GünterZöchbauer:我不确定我是否完全理解您。类型
int
的实现是相同的。例如,如果
C
扩展了
A
(或
A
A
),那么为了从
C
的实例中获得有序索引,我需要将该代码从
B
的定义复制并粘贴到
C
的定义中。我的问题是:这肯定是糟糕的OOP实践,功能应该在父类中实现吗?在我们讨论将实现提供给其他类之前,我们应该首先能够使它在一个类中工作。我认为我们还没有到达那里;-)谢谢你的意见,但我认为至少有一个“我们”已经在那里了@甘特斯鲍尔:啊,我想我明白误解是什么了。请注意,在上面的代码中,我并没有试图对列表进行排序,而是想得到排序列表的索引序列……很好!我不需要任何子体来包装不可比较对象的列表,但这也是很好的信息。
abstract class ComparableA<T extends Comparable<T>> extends A<T> {
   List<int> orderedIndices() => new List<int>.generate( ....
   ...
}
List<int> orderedIndics(int Function(T, T) compare) {
  return List.generate(internalList.length,(i) => i)..sort(
      (i, j) => compare(internalList[i], internalList[j]));
}