我想在dart中创建一个更专业的列表。我无法直接延长List。我有什么选择?
答案 0 :(得分:17)
要创建类实现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
}
length
,operator[]
,operator[]=
和length=
: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
}
DelegatingList
List
quiver package人
import 'package:quiver/collection.dart';
class MyCustomList<E> extends DelegatingList<E> {
final List<E> _l = [];
List<E> get delegate => _l;
// your custom methods
}
DelegatingList
List
collection package人
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
}
根据您的代码,每个选项都有其优点。如果您包装/委托现有列表,则应使用最后一个选项。否则,根据您的类型层次结构使用两个第一个选项中的一个(mixin允许扩展其他对象)。
答案 1 :(得分:13)
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);
}
答案 2 :(得分:3)
扩展类的一种新方法是introduced with Dart 2.6。
您现在可以像这样创建extension
的{{1}}:
List
您添加的can be used implicitly方法,即,您导入extension MyCustomList<T> on List<T> {
// Any methods you want can be added here.
}
时可以在任何List
上使用它们。
这是example from the feature specification:
extension
您可以在任何extension MyFancyList<T> on List<T> {
int get doubleLength => this.length * 2;
List<T> operator-() => this.reversed.toList();
List<List<T>> split(int at) =>
<List<T>>[this.sublist(0, at), this.sublist(at)];
List<T> mapToList<R>(R Function(T) convert) => this.map(convert).toList();
}
上使用这些新成员,例如像这样:
List
答案 3 :(得分:3)
这个问题的答案已经过时了,我正在为自己的项目做这件事,所以我想我会通过发布一个不涉及任何替代或覆盖的真正干净的答案来帮助一些人。实现事物。
quiver程序包具有一个名为DelegatingList的可扩展列表类,它使扩展列表变得很简单。
class FruitList extends DelegatingList<Fruit> {
final List<Fruit> _fruits = [];
List<Fruit> get delegate => _fruits;
// custom methods
}
希望这对像我一样遇到这个问题的人有所帮助!
答案 4 :(得分:0)
根据上面的答案,您可以像这样创建一个不可变的列表:
class ImmutableList<E> extends ListBase<E> {
late final List<E> innerList;
ImmutableList(Iterable<E> items) {
innerList = List<E>.unmodifiable(items);
}
@override
int get length => innerList.length;
@override
set length(int length) {
innerList.length = length;
}
@override
void operator []=(int index, E value) {
innerList[index] = value;
}
@override
E operator [](int index) => innerList[index];
}
答案 5 :(得分:-1)
//list is your given List and iterable is any object in dart that can be iterated
list.addAll(Iterable)