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