Hàm và lớp Generic
Bạn có thể xây dựng các lớp, các hàm mà khi khai báo thì nó không làm việc trên một kiểu
dữ liệu cụ thể nào cả, mà kiểu dữ liệu nó làm việc là chung chung, ký hiệu là kiểu dữ liệu A
,
kiểu dữ liệu B
, kiểu dữ liệu E
, T
...
Chỉ đến khi triển khai lớp thành đối tượng mới chỉ định A
là kiểu cụ thể gì, B
là kiểu gì ... Các hàm, lớp xây dựng theo cách đó gọi là là hàm, lớp Generic
Để khai báo lớp làm việc trên kiểu dữ liệu chung gì thì khai báo ký hiệu đại diện kiểu dữ liệu trong
<...>
sau tên lớp, ví dụ lớp MyClass
sẽ làm việc trên kiểu E và T
class MyClassX<E, T> { }
Tương tự như hàm, hàm sau nhận tham số kiểu T
fncGeneric<T>(T thamso) { print(thamso); }
T
, E
cụ thể là kiểu gì thì chỉ định khi tạo đối tượng từ lớp Generic
var a = new MyClass<int, String>(); //Ký hiệu E sẽ là kiểu int //Kỹ hiệu T sẽ là kiểu String var b = new MyClass<double, int>(); //Ký hiệu E sẽ là kiểu double //Kỹ hiệu T sẽ là kiểu int
Ví dụ
class MyClass<E,T> { E thuoctinh1; T thuoctinh2; setThuoctinh(E t1, T t2) { this.thuoctinh1 = t1; this.thuoctinh2 = t2; } show() { print(this.thuoctinh1); print(this.thuoctinh2); } } fncGeneric<T>(T thamso) { print(thamso); } main() { var a = new MyClass<int, String>(); a.setThuoctinh(11, 'Lop Generic'); a.show(); fncGeneric<int>(111); }
Thư viện Generic
Trong Dart có nhiều cấu trúc dữ liệu xây dựng sẵn bằng kỹ thuật Generic (xem Cấu trúc dữ liệu Dart),
Bạn có thể sử dụng để khởi tạo đó là:
DoubleLinkedQueue<E>
HashMap<K,V>
HashSet<E>
LinkedHashMap<K,V>
LinkedHashSet<E>
LinkedList<E extends LinkedListEntry<E>>
Queue<E>