2012-12-13 15 views
6

私自身の特定のリストで汎用リストを拡張することは可能ですか?ような何か:リストを拡張する<T>クラス

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

そして、どのようにこれはで行われていないとして、その後、親のコンストラクタを呼び出すために:

class Tweets<Tweet> extends List<T> 

そして、どのようにコンストラクタの外観が望む、私は自分のコンストラクタで構築したい場合拡張クラス?

+0

あなたがこれを行うだけではなく、通常のリストを使用してする必要がある理由はありますか? –

+0

Duplicate ofquestions/16247045/how-do-i-extend-a-list-in-dart –

答えて

1

ダーツのListは、ファクトリを持つ抽象クラスです。

私はあなたがこのようにそれを実装することができると思う:

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

あり、これを行うための任意の直接的な方法であるように見えるとバグチケットもありますように見えるしません:http://code.google.com/p/dart/issues/detail?id=2600

更新: 1つの方法は、noSuchMethod()と転送コールを使用することです。

+0

ありがとう、私は 'List'がファクトリを持つ抽象クラスであることを知らなかった。 DartEditorを見ると、実装する必要があるメソッドがたくさんあります。うーん、私が望む解決策ではありません。 – JvdBerg

4

これは私がリストの動作を拡張するために出て見つけたものです:

  1. インポート「ダーツ:コレクション」;
  2. ListBase
  3. []とlength getterとsetterを実装しています。

適応されたTweetの例を参照してください。それは、カスタムのツイートメソッドと標準のリストメソッドを使用します。

add/addAllが削除されていることに注意してください。

出力:

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

コード:

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()); 
} 
関連する問題