2012-12-13 25 views
6

Czy możliwe jest rozszerzenie ogólnej listy o moją własną, konkretną listę. Coś jak:Rozszerzanie listy <T> klasa

class Tweets<Tweet> extends List<T> 

i jak spojrzenie konstruktor jak gdybym chciał skonstruować z własnego konstruktora:

Datasource datasource = new Datasource('http://search.twitter.com/search.json'); 
Tweets tweets = new Tweets<Tweet>(datasource); 

A jak wywołać konstruktor rodzica wtedy, gdy nie odbywa się w rozszerzona klasa?

+0

Czy istnieje powód, trzeba to zrobić, a nie tylko za pomocą zwykłego listę? –

+0

Duplikat http://stackoverflow.com/questions/16247045/how-do-i-extend-a-list-in-dart –

Odpowiedz

1

Dart to List to klasa abstrakcyjna z fabrykami.

Myślę, że można wdrożyć go tak:

class Tweet { 
    String message; 

    Tweet(this.message); 
} 

class Tweets<Tweet> implements List<Tweet> { 
    List<Tweet> _list; 

    Tweets() : _list = new List<Tweet>(); 

    add(Tweet t) => _list.add(t); 
    addAll(Collection<Tweet> tweets) => _list.addAll(tweets); 
    String toString() => _list.toString(); 
} 


main() { 
    var t = new Tweet('hey'); 
    var t2 = new Tweet('hey'); 

    var tl = new Tweets(); 
    tl.addAll([t, t2]); 

    print(tl); 
} 

Nie wydaje się być jakikolwiek bezpośredni sposób to zrobić i wygląda tam także bilet bug: http://code.google.com/p/dart/issues/detail?id=2600

Aktualizacja: Jednym ze sposobów jest użycie noSuchMethod() i przekierowywanie połączeń.

+0

Dzięki, nie wiedziałem, że 'List' jest klasą abstrakcyjną z fabrykami. Kiedy patrzę w DartEditor, istnieje wiele metod, które należy wdrożyć. Hmm .. nie rozwiązanie, na które miałem nadzieję. – JvdBerg

4

To, co okazało się rozszerzyć listę zachowanie:

  1. import 'dart: Kolekcja';
  2. przedłuża ListBase
  3. narzędzie [] i długość gettera i setera.

Zobacz zaadaptowany tekst przykładowy poniżej. Korzysta z niestandardowej metody Tweets i standardowej listy.

Należy zauważyć, że polecenie add/addAll zostało usunięte.

wyjściowa:

[hello, world, hello] 
[hello, hello] 
[hello, hello] 

Kod:

import 'dart:collection'; 

class Tweet { 
    String message; 

    Tweet(this.message); 
    String toString() => message; 
} 

class Tweets<Tweet> extends ListBase<Tweet> { 

    List<Tweet> _list; 

    Tweets() : _list = new List(); 


    void set length(int l) { 
    this._list.length=l; 
    } 

    int get length => _list.length; 

    Tweet operator [](int index) => _list[index]; 

    void operator []=(int index, Tweet value) { 
    _list[index]=value; 
    } 

    Iterable<Tweet> myFilter(text) => _list.where((Tweet e) => e.message.contains(text)); 

} 


main() { 
    var t = new Tweet('hello'); 
    var t2 = new Tweet('world'); 

    var tl = new Tweets(); 
    tl.addAll([t, t2]); 
    tl.add(t); 

    print(tl); 
    print(tl.myFilter('hello').toList()); 
    print(tl.where((Tweet e) => e.message.contains('hello')).toList()); 
}