繁体   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