2013-04-27 54 views

Trả lời

11

Có một lớp ListBase trong phi tiêu: bộ sưu tập. Nếu bạn mở rộng lớp này, bạn chỉ cần thực hiện:

  • get length
  • set length
  • []=
  • []

Dưới đây là một ví dụ:

import 'dart:collection'; 

class FancyList<E> extends ListBase<E> { 
    List innerList = new List(); 

    int get length => innerList.length; 

    void set length(int length) { 
    innerList.length = length; 
    } 

    void operator[]=(int index, E value) { 
    innerList[index] = value; 
    } 

    E operator [](int index) => innerList[index]; 

    // Though not strictly necessary, for performance reasons 
    // you should implement add and addAll. 

    void add(E value) => innerList.add(value); 

    void addAll(Iterable<E> all) => innerList.addAll(all); 
} 

void main() { 
    var list = new FancyList(); 

    list.addAll([1,2,3]); 

    print(list.length); 
} 
+0

Câu hỏi được đặt ra cụ thể về các tùy chọn, bạn có thể làm rõ những việc khác bạn có thể làm không? –

+0

@amouravski Tôi rất muốn biết :) –

+0

Tôi đoán hai tùy chọn khác sẽ là triển khai giao diện Danh sách hoặc sử dụng Danh sách làm bản mixin. –

16

Để thực hiện một lớp thực hiện List có một số cách:

import 'dart:collection'; 

class MyCustomList<E> extends ListBase<E> { 
    final List<E> l = []; 
    MyCustomList(); 

    void set length(int newLength) { l.length = newLength; } 
    int get length => l.length; 
    E operator [](int index) => l[index]; 
    void operator []=(int index, E value) { l[index] = value; } 

    // your custom methods 
} 
import 'dart:collection'; 

class MyCustomList<E> extends Base with ListMixin<E> { 
    final List<E> l = []; 
    MyCustomList(); 

    void set length(int newLength) { l.length = newLength; } 
    int get length => l.length; 
    E operator [](int index) => l[index]; 
    void operator []=(int index, E value) { l[index] = value; } 

    // your custom methods 
} 
import 'package:quiver/collection.dart'; 

class MyCustomList<E> extends DelegatingList<E> { 
    final List<E> _l = []; 

    List<E> get delegate => _l; 

    // your custom methods 
} 
import 'package:collection/wrappers.dart'; 

class MyCustomList<E> extends DelegatingList<E> { 
    final List<E> _l; 

    MyCustomList() : this._(<E>[]); 
    MyCustomList._(l) : 
    _l = l, 
    super(l); 

    // your custom methods 
} 

Tùy thuộc vào mã của bạn, mỗi tùy chọn trong số đó có lợi thế. Nếu bạn gói/ủy quyền danh sách hiện tại, bạn nên sử dụng tùy chọn cuối cùng. Nếu không, hãy sử dụng một trong hai tùy chọn đầu tiên tùy thuộc vào thứ bậc kiểu của bạn (mixin cho phép mở rộng một đối tượng khác).

+1

Bạn cũng có thể sử dụng DelegatingList từ gói: collection/wrappers.dart theo cách tương tự với gói từ rung động – lrn

+0

Tôi đang thử tùy chọn thứ hai, nhưng nhận được một lỗi trong IDE 'Base' 'Minin chỉ có thể áp dụng cho lớp | không xác định lớp Base'! –

+0

Sử dụng cách tiếp cận đầu tiên, cách xác định danh sách các danh sách với phương pháp này, tôi không thể định nghĩa' MyCustomList [MyCustomList] ':( –

Các vấn đề liên quan