print - ¿Cómo extiendo una lista en Dart?
print list flutter (2)
Quiero crear una lista más especializada en dardo. No puedo extender directamente la List . ¿Cuáles son mis opciones?
Hay una clase ListBase en dart: collection. Si extiendes esta clase, solo necesitas implementar:
-
get length
-
set length
-
[]=
-
[]
Aquí hay un ejemplo:
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);
}
Para hacer una List implementos de clase hay varias maneras:
- Extendiendo ListBase e implementando la
length
, eloperator[]
, eloperator[]=
y lalength=
:
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
}
- Mixin ListMixin y
length
implementación,operator[]
,operator[]=
ylength=
:
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
}
- Delegación a otra
List
conDelegatingList
del paquete quiver :
import ''package:quiver/collection.dart'';
class MyCustomList<E> extends DelegatingList<E> {
final List<E> _l = [];
List<E> get delegate => _l;
// your custom methods
}
- Delegación a otra
List
conDelegatingList
del paquete de recopilación :
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
}
Dependiendo de su código, cada una de esas opciones tiene sus ventajas. Si envuelve / delega una lista existente, debe usar la última opción. De lo contrario, use una de las dos primeras opciones según su jerarquía de tipos (la mezcla permite extender otro objeto).