2012-12-13 7 views
6

Ist es möglich, eine generische Liste mit meiner eigenen spezifischen Liste zu erweitern. Etwas wie:Erweitern der Liste <T> Klasse

class Tweets<Tweet> extends List<T> 

Und wie würde ein Konstruktor aussehen, wenn ich wollte mit meinem eigenen Konstruktor konstruieren:

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

Und wie die Mutter Konstruktor aufzurufen dann, da dies nicht in getan wird eine erweiterte Klasse?

+0

Gibt es einen Grund, warum Sie dies tun müssen, anstatt nur eine normale Liste mit? –

+0

Dupplicate von http://stackoverflow.com/questions/16247045/how-do-i-e-tend-a-list-in-dart –

Antwort

1

Dart's List ist eine abstrakte Klasse mit Fabriken.

Ich glaube, Sie es wie folgt implementieren könnte:

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

Es scheint keinen direkten Weg, dies zu tun und sieht aus wie es ist auch ein Bug-Ticket: http://code.google.com/p/dart/issues/detail?id=2600

Update: Eine Möglichkeit besteht darin, noSuchMethod() zu verwenden und Anrufe weiterzuleiten.

+0

Danke, ich wusste nicht, dass eine 'List' eine abstrakte Klasse mit Fabriken ist. Wenn ich in den DartEditor schaue, gibt es viele Methoden, die implementiert werden müssen. Hmm .. nicht die Lösung, die ich mir erhofft hatte. – JvdBerg

4

Dies ist, was ich Liste Verhalten erweitern herausgefunden:

  1. Import 'dart: Sammlung';
  2. erweitert ListBase
  3. implementieren [] und Länge Getter und Setter.

Siehe angepasst Tweet Beispiel unten. Es verwendet eine benutzerdefinierte Tweets-Methode und eine Standardlistenmethode.

Beachten Sie, dass add/addAll entfernt wurde.

Ausgang:

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

Code:

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()); 
} 
Verwandte Themen