2012-12-13 41 views
6

Có thể mở rộng danh sách chung với danh sách cụ thể của riêng tôi không. Một cái gì đó như:Mở rộng Danh sách <T> lớp

class Tweets<Tweet> extends List<T> 

Và sẽ như thế nào một cái nhìn constructor như, nếu tôi muốn xây dựng với nhà xây dựng của riêng tôi:

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

Và làm thế nào để gọi constructor mẹ sau đó, vì điều này không được thực hiện trong một lớp học mở rộng?

+0

Có một lý do bạn cần phải làm điều này thay vì chỉ sử dụng một danh sách bình thường không? –

+0

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

Trả lời

1

Phi tiêu List là lớp trừu tượng với các nhà máy.

Tôi nghĩ rằng bạn có thể thực hiện nó như thế này:

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

Có vẻ như không được bất kỳ cách nào trực tiếp để làm điều này và trông giống như cũng có một vé lỗi: http://code.google.com/p/dart/issues/detail?id=2600

Cập nhật: Một cách là sử dụng noSuchMethod() và chuyển tiếp cuộc gọi.

+0

Cảm ơn, tôi không biết rằng một 'Danh sách' là một lớp trừu tượng với các nhà máy. Khi tôi nhìn vào DartEditor, có rất nhiều phương pháp cần được triển khai. Hmm .. không phải là giải pháp tôi hy vọng. – JvdBerg

4

Đây là những gì tôi phát hiện ra để mở rộng danh sách các hành vi:

  1. nhập khẩu 'phi tiêu: bộ sưu tập';
  2. mở rộng ListBase
  3. triển khai [] và getter dài và setter.

Xem ví dụ về Tweet được chỉnh sửa bên dưới. Nó sử dụng phương thức Tweets tùy chỉnh và phương pháp danh sách chuẩn.

Lưu ý rằng add/addAll đã bị xóa.

Output:

[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()); 
} 
Các vấn đề liên quan