Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 65 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
65
Dung lượng
1,5 MB
Nội dung
Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội IT3100 LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 09 Lập trình tổng quát CuuDuongThanCong.com https://fb.com/tailieudientucntt Mục tiêu ◼ ◼ ◼ ◼ Giới thiệu lập trình tổng quát cách thực ngơn ngữ lập trình Giới thiệu collection framework với cấu trúc tổng quát: List, HashMap, Tree, Set, Vector,… Định nghĩa sử dụng Template ký tự đại diện (wildcard) Ví dụ tập vấn đề với ngơn ngữ lập trình Java CuuDuongThanCong.com https://fb.com/tailieudientucntt Nội dung Giới thiệu lập trình tổng quát Lập trình tổng quát Java ◼ ◼ Giới thiệu collection framework Giới thiệu cấu trúc tổng quát List, HashMap, Tree, Set, Vector Định nghĩa sử dụng Template Ký tự đại diện (Wildcard) Ví dụ tập CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới thiệu lập trình tổng quát (Generic programming) CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới thiệu lập trình tổng qt ◼ Tổng qt hóa chương trình để hoạt động với kiểu liệu khác nhau, kể kiểu liệu tương lai Tổng quát hoá ◼ Thuật tốn xác định Ví dụ: chương trình Phương thức sort() • Số nguyên int • Xâu ký tự String • Đối tượng số phức Complex object • Lớp lưu trữ kiểu ngăn xếp (Stack) • Lớp IntegerStack → đối tượng Integer • Lớp StringStack → đối tượng String • Lớp AnimalStack → đối tượng animal,… ◼ CuuDuongThanCong.com Thuật toán giống nhau, khác kiểu liệu Các lớp có cấu trúc tương tự, khác kiểu đối tượng xử lý https://fb.com/tailieudientucntt Giới thiệu lập trình tổng quát ◼ Lập trình Generic có nghĩa lập trình mà tái sử dụng cho nhiều kiểu liệu ◼ ◼ Cho phép trừu tượng hóa kiểu liệu Giải pháp ngơn ngữ lập trình: ◼ ◼ ◼ ◼ C: dùng trỏ không định kiểu (con trỏ void) C++: dùng template Java 1.5 trở trước: lợi dụng upcasting kiểu tổng quát object Java 1.5: đưa khái niệm template CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới thiệu lập trình tổng qt ◼ Ví dụ C: hàm memcpy() thư viện string.h void* memcpy(void* region1, const void* region2, size_t n); ◼ ◼ Hàm memcpy() bên khai báo tổng quát cách sử dụng trỏ void* Điều giúp cho hàm sử dụng với nhiều kiểu liệu khác ◼ ◼ Dữ liệu truyền vào cách tổng quát thông qua địa kích thước kiểu liệu Hay nói cách khác, để chép liệu, ta cần địa kích cỡ chúng CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới thiệu lập trình tổng qt ◼ Ví dụ: Lập trình Generic từ trước Java 1.5 public class ArrayList { public Object get(int i) { } public void add(Object o) { } private Object[] elementData; } ◼ Lớp Object lớp cha tổng quát → chấp nhận đối tượng thuộc lớp List myList = new ArrayList(); myList.add("Fred"); myList.add(new Dog()); myList.add(new Integer(42)); ◼ Các đối tượng danh sách khác hẳn Hạn chế: Phải ép kiểu ➔ ép sai kiểu (run-time error) String name = (String) myList.get(1); //Dog!!! CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới thiệu lập trình tổng quát ◼ Ví dụ: Lập trình Generic từ Java 1.5 ◼ Java 1.5 Template Danh sách chấp nhận đối tượng có kiểu Integer List myList = new LinkedList(); myList.add(new Integer(0)); Integer x = myList.iterator().next(); //Không cần ép kiểu myList.add(new String("Hello")); //Compile Error CuuDuongThanCong.com https://fb.com/tailieudientucntt Lập trình tổng quát Java (Collection framework) 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giới hạn kiểu liệu tổng quát ◼ Chấp nhận kiểu lớp 2DShape Ví dụ: public class Information { private T value; public Information(T value) { this.value = value; } public T getValue() { return value; } } Information pointInfo = new Information(new Point()); // OK Information stringInfo = new Information(); // error CuuDuongThanCong.com https://fb.com/tailieudientucntt 51 Ký tự đại diện (Wildcard) 52 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ ◼ Quan hệ thừa kế hai lớp khơng có ảnh hưởng đến quan hệ cấu trúc tổng quát dùng cho hai lớp Ví dụ: ◼ ◼ ◼ Dog Cat lớp Animal → Có thể đưa đối tượng Dog Cat vào ArrayList Tuy nhiên, ArrayList, ArrayList lại khơng có quan hệ với ArrayList 53 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ Generic ◼ ◼ Kiểu khai báo lớp tổng quát (template) khởi tạo phải với kiểu đối tượng thực Nếu khai báo List ➔ Danh sách chấp nhận đối tượng lớp Foo, đối tượng cha lớp Foo không chấp nhận class Parent { } class Child extends Parent { } List myList = new ArrayList(); 54 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ ◼ Làm để xây dựng tập hợp dành cho kiểu lớp lớp cụ thể đó? → Giải pháp sử dụng kí tự đại diện (wildcard) Ký tự đại diện: ? dùng để hiển thị cho kiểu liệu chưa biết collection void printCollection(Collection c) { for (Object e : c) { System.out.println(e); } } ◼ Khi biên dịch, dấu ? thay 55 kiểu liệu CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ Tuy nhiên viết không hợp lệ Collection c = new ArrayList(); c.add("a1"); //compile error, null ◼ Vì khơng biết c đại diện cho tập hợp kiểu liệu ➔ thêm phần tử vào c 56 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ ◼ ◼ "? extends Type": Xác định tập kiểu Type Đây wildcard hữu ích "? super Type": Xác định tập kiểu cha Type "?": Xác định tập tất kiểu kiểu 57 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ký tự đại diện (Wildcard) ◼ Ví dụ: ◼ ◼ ? extends Animal có nghĩa kiểu thuộc loại Animal Hai cú pháp sau tương đương: public void foo( ArrayList