[英]Defining a type to be a `Comparable` in Dart
這個問題可能源於對Dart對OOP的理解不足,但是無論如何:
我一直在從事一個項目,我的一個基類為此項目從dart:collections
擴展了ListBase
。 在某些情況下,能夠獲得這些類似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]
orderedIndices
[1, 5, 2, 4, 3]
作為其internalList
則orderedIndices
將按orderedIndices
返回[0, 2, 4, 3, 1]
orderedIndices
[0, 2, 4, 3, 1]
。
但是,我想將實現orderedIndices
的代碼放入類A
的定義中,因為只要指定的類型T
是Comparable
(即,具有compareTo
定義),它在A
的任何后代中都是相同的。 我不知道如何做到這一點,但是,因為不知道類型T
,飛鏢無法知道是否方式T
情況確實是Comparable
,並在咳嗽compareTo
如果我嘗試將代碼放在A
的定義。
盡管可行,但我反對將代碼復制粘貼到同一類的子孫中的想法...是否可以通過某種方式告訴Dart在A
定義中T
將是可Comparable
?
如果要將A
T
限制為可比較的類型。 這是通過在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]));
...
如果不是所有版本的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
作為實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.