Tôi muốn tạo danh sách chuyên biệt hơn về phi tiêu. Tôi không thể trực tiếp mở rộng List. Những lựa chọn của tôi là gì?Làm cách nào để mở rộng Danh sách trong Dart?
Trả lời
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);
}
Để thực hiện một lớp thực hiện List có một số cách:
- Mở rộng ListBase và thực hiện
length
,operator[]
,operator[]=
vàlength=
:
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
}
- Mixin ListMixin và thực hiện
length
,operator[]
,operator[]=
vàlength=
:
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
}
- ủy thác cho một
List
khác vớiDelegatingList
từ quiver package:
import 'package:quiver/collection.dart';
class MyCustomList<E> extends DelegatingList<E> {
final List<E> _l = [];
List<E> get delegate => _l;
// your custom methods
}
- ủy thác cho một
List
khác vớiDelegatingList
từ collection package:
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).
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
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'! –
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â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? –
@amouravski Tôi rất muốn biết :) –
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. –