Voglio creare una lista più specializzata in freccette. Non posso estendere direttamente List. Quali sono le mie opzioni?Come estendere un elenco in Dart?
risposta
Esiste una classe ListBase in dart: collection. Se si estende questa classe, è sufficiente implementare:
get length
set length
[]=
[]
Ecco un esempio:
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);
}
Per fare una classe implementa List ci sono diversi modi:
- Estendere ListBase e l'attuazione di
length
,operator[]
,operator[]=
elength=
:
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 e l'attuazione di
length
,operator[]
,operator[]=
elength=
:
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
}
- delega a un altro
List
conDelegatingList
dal 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
}
- delega a un altro
List
conDelegatingList
dal 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
}
A seconda del codice, ciascuna di queste opzioni ha i suoi vantaggi. Se si esegue il wrapping/delegare un elenco esistente, è necessario utilizzare l'ultima opzione. Altrimenti usa una delle prime due opzioni a seconda della tua gerarchia di tipi (mixin che consente di estendere un altro oggetto).
Puoi anche usare DelegatingList dal pacchetto: collection/wrappers.dart in modo simile a quello da faretra – lrn
Sto provando la seconda opzione, ma ricevendo un errore l'IDE sotto 'Base' dicendo: Minin può applicare solo per le classi | classe non definita Base!! –
Utilizzando il primo approccio, come definire un elenco di liste con questo approccio, non potrei definire 'MyCustomList [MyCustomList] ':( –
- 1. DART: indexOf() in un elenco di istanze
- 2. perché estendere un elenco python
- 3. Elenco estendere comportamento strano
- 4. Come dovrei testare un futuro in Dart?
- 5. Come caricare un file in Dart?
- 6. Come ottenere un timestamp in Dart?
- 7. Come generare un ID univoco in Dart
- 8. Come estendere un NSArray?
- 9. Come "dormire" un programma Dart
- 10. Window.navigator.getGamepads() in Dart funziona?
- 11. Come caricare un'immagine in Dart
- 12. Come estendere un helper in CodeIgniter?
- 13. Come firmare-estendere un numero in Verilog
- 14. In Swift, come estendere un typealias?
- 15. Rails: come estendere un generatore?
- 16. come posso estendere un servizio
- 17. Come estendere un oggetto javascript?
- 18. Come stampare un messaggio quando un assert fallisce, in Dart?
- 19. Dart
- 20. Come eseguire Dart su un server?
- 21. Embedding Dart in applicazione
- 22. Esecuzione di dart in un server Web
- 23. Variabili globali in Dart
- 24. Client server in Dart
- 25. Console.log in Dart Language
- 26. come distribuire l'applicazione web dart con i pacchetti dart?
- 27. Come creare un'istanza dell'elemento personalizzato Dart Polymer nel codice Dart?
- 28. Come ereditare ed estendere un oggetto lista in Python?
- 29. urlencoding in Dart
- 30. Come disabilitare un pulsante utilizzando i collegamenti dati in Dart?
La domanda posta in particolare sulle opzioni, potresti chiarire cos'altro potresti fare? –
@amouravski Mi piacerebbe saperlo :) –
Immagino che le altre due opzioni siano implementare l'interfaccia Elenco, o usare List come mixin. –