2012-12-13 62 views
6

是否可以使用我自己的特定列表來擴展通用列表。喜歡的東西:擴展名單<T>類

class Tweets<Tweet> extends List<T> 

?如何構造的樣子,如果我想用我自己的構造函數構造:

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

以及如何調用父構造的話,因爲這不是在做擴展課程?

+0

是否有你需要做到這一點,而不是僅僅使用普通列表理由嗎? –

+0

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

回答

1

Dart的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

更新:一種方法是使用noSuchMethod()並轉發呼叫。

+0

謝謝,我不知道'List'是一個帶工廠的抽象類。當我看着DartEditor時,有很多方法需要實施。嗯..不是我希望的解決方案。 – JvdBerg

4

這是我發現了什麼擴展列表行爲:

  1. 進口「鏢:集」;
  2. extends ListBase
  3. implements []和length getter和setter。

查看改編後的示例波紋管。它使用自定義Tweets方法和標準列表方法。

請注意,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()); 
}