簡體   English   中英

在Dart中將類型定義為“可比較”

[英]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]作為其internalListorderedIndices將按orderedIndices返回[0, 2, 4, 3, 1] orderedIndices [0, 2, 4, 3, 1]

但是,我想將實現orderedIndices的代碼放入類A的定義中,因為只要指定的類型TComparable (即,具有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的元素。 如果TComparable ,則可以使用Comparable.compare作為實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM