2013-04-27 10 views

risposta

11

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); 
} 
+0

La domanda posta in particolare sulle opzioni, potresti chiarire cos'altro potresti fare? –

+0

@amouravski Mi piacerebbe saperlo :) –

+0

Immagino che le altre due opzioni siano implementare l'interfaccia Elenco, o usare List come mixin. –

16

Per fare una classe implementa List ci sono diversi modi:

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 
} 

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).

+1

Puoi anche usare DelegatingList dal pacchetto: collection/wrappers.dart in modo simile a quello da faretra – lrn

+0

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!! –

+0

Utilizzando il primo approccio, come definire un elenco di liste con questo approccio, non potrei definire 'MyCustomList [MyCustomList] ':( –