Lib và Package (Bài trước)
(Bài tiếp) Ngoại lệ

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>


Đăng ký nhận bài viết mới
Lib và Package (Bài trước)
(Bài tiếp) Ngoại lệ