32

dart でより専門的なリストを作成したい。Listを直接拡張することはできません。私のオプションは何ですか?

4

6 に答える 6

36

クラスにListを実装させるには、いくつかの方法があります。

import 'dart:collection';

class MyCustomList<E> extends ListBase<E> {
  final List<E> l = [];
  MyCustomList();

  void set length(int newLength) { l.length = newLength; }
  int get length => l.length;
  E operator [](int index) => l[index];
  void operator []=(int index, E value) { l[index] = value; }

  // your custom methods
}
import 'dart:collection';

class MyCustomList<E> extends Base with ListMixin<E> {
  final List<E> l = [];
  MyCustomList();

  void set length(int newLength) { l.length = newLength; }
  int get length => l.length;
  E operator [](int index) => l[index];
  void operator []=(int index, E value) { l[index] = value; }

  // your custom methods
}
import 'package:quiver/collection.dart';

class MyCustomList<E> extends DelegatingList<E> {
  final List<E> _l = [];

  List<E> get delegate => _l;

  // your custom methods
}
import 'package:collection/wrappers.dart';

class MyCustomList<E> extends DelegatingList<E> {
  final List<E> _l;

  MyCustomList() : this._(<E>[]);
  MyCustomList._(l) :
    _l = l,
    super(l);

  // your custom methods
}

コードに応じて、これらのオプションにはそれぞれ利点があります。既存のリストをラップ/デリゲートする場合は、最後のオプションを使用する必要があります。それ以外の場合は、型階層に応じて最初の 2 つのオプションのいずれかを使用します (別のオブジェクトを拡張できる mixin)。

于 2013-08-29T10:09:41.403 に答える
18

dart:collection には ListBase クラスがあります。このクラスを拡張する場合、実装する必要があるのは次のとおりです。

  • get length
  • set length
  • []=
  • []

次に例を示します。

import 'dart:collection';

class FancyList<E> extends ListBase<E> {
  List innerList = new List();

  int get length => innerList.length;

  void set length(int length) {
    innerList.length = length;
  }

  void operator[]=(int index, E value) {
    innerList[index] = value;
  }

  E operator [](int index) => innerList[index];

  // Though not strictly necessary, for performance reasons
  // you should implement add and addAll.

  void add(E value) => innerList.add(value);

  void addAll(Iterable<E> all) => innerList.addAll(all);
}

void main() {
  var list = new FancyList();

  list.addAll([1,2,3]);

  print(list.length);
}
于 2013-04-27T00:34:30.363 に答える
-2
    //list is your given List and iterable is any object in dart that can be iterated
    list.addAll(Iterable)
于 2020-03-29T10:08:28.523 に答える