首页 > 解决方案 > 在 Dart 中将类型定义为“Comparable”

问题描述

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

我一直在做一个项目,我的一个基类ListBasedart:collections. 在某些情况下,我遇到能够获得这些类似列表的对象的排序索引(而不实际对它们进行排序)是很有用的。

作为父类,我有类似的东西(高度简化):

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]));
}

例如,如果Bhas [1, 5, 2, 4, 3]as its internalListthen的实例将按预期orderedIndices返回[0, 2, 4, 3, 1]

但是,我想将实现的代码orderedIndices放入 class的定义中,因为只要指定的类型是(即已定义)A,它在任何后代中都是相同的。但是,我不知道如何做到这一点,因为在不知道 type 的情况下,Dart 无法知道实例是否确实存在,并且如果我尝试将代码放入's 定义中,就会咳嗽。ATComparablecompareToTTComparablecompareToA

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

标签: oopdart

解决方案


如果您想限制TA可比较的类型。这是通过设置界限来完成的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用作实现。


推荐阅读