Những nội dung chính được trình bày trong chương này gồm có: Giới thiệu về lập trình tổng quát và cách thực hiện trong các ngôn ngữ lập trình; giới thiệu về collection framework với các cấu trúc tổng quát: List, HashMap, Tree, Set, Vector; định nghĩa và sử dụng Template và ký tự đại diện (wildcard); ví dụ và bài tập về các vấn đề trên với ngôn ngữ lập trình Java. Mời các bạn cùng tham khảo bài giảng để biết thêm nội dung chi tiết.
ng c om 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 an co IT3100 du o ng th LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG cu u Bài 09 Lập trình tổng quát CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 cu u ◼ du o ng th an ◼ co ng ◼ c om Mục tiêu ◼ CuuDuongThanCong.com https://fb.com/tailieudientucntt ng ng ◼ Giới thiệu collection framework Giới thiệu cấu trúc tổng quát List, HashMap, Tree, Set, Vector co ◼ an Giới thiệu lập trình tổng quát Lập trình tổng quát Java th .c om Nội dung du o u Định nghĩa sử dụng Template Ký tự đại diện (Wildcard) Ví dụ tập cu 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om cu u du o ng th an co ng Giới thiệu lập trình tổng quát (Generic programming) CuuDuongThanCong.com https://fb.com/tailieudientucntt Tổng quát 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 qt hố chương trình Ví dụ: th • Số nguyên int • Xâu ký tự String • Đối tượng số phức Complex object • ng cu u Phương thức sort() Thuật toán giống nhau, khác kiểu liệu du o ◼ Thuật toán xác định an ◼ co ng ◼ c om Giới thiệu lập trình tổng quát Lớp lưu trữ kiểu ngăn xếp (Stack) CuuDuongThanCong.com • Lớp IntegerStack → đối tượng Integer • Lớp StringStack → đối tượng String • Lớp AnimalStack → đối tượng animal,… 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 qt an Giải pháp ngơn ngữ lập trình: ◼ th ng ◼ 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 du o ◼ u ◼ Cho phép trừu tượng hóa kiểu liệu co ◼ ng c om 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 ◼ cu ◼ CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ C: hàm memcpy() thư viện string.h co 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 ng du o ◼ 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 u ◼ th an ◼ ng void* memcpy(void* region1, const void* region2, size_t n); ◼ cu ◼ c om Giới thiệu lập trình tổng quát CuuDuongThanCong.com https://fb.com/tailieudientucntt ◼ c om Giới thiệu lập trình tổng qt Ví dụ: Lập trình Generic từ trước Java 1.5 th an co ng public class ArrayList { public Object get(int i) { } public void add(Object o) { } private Object[] elementData; } ng Lớp Object lớp cha tổng quát → chấp nhận đối tượng thuộc lớp du o ◼ cu u 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 ◼ c om 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 th ng du o Danh sách chấp nhận đối tượng có kiểu Integer an co ng ◼ cu u 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 .c om cu u du o ng th an co ng 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 c om ◼ Chấp nhận kiểu lớp 2DShape Ví dụ: ng public class Information { cu u du o ng th an co 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 .c om ng co cu u du o ng th an Ký tự đại diện (Wildcard) 52 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 ◼ th ng du o ◼ 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 u ◼ an Ví dụ: cu ◼ co ng ◼ c om Ký tự đại diện (Wildcard) 53 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 u du o ng ◼ th an co ◼ ng ◼ c om Ký tự đại diện (Wildcard) cu class Parent { } class Child extends Parent { } List myList = new ArrayList(); 54 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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) co ng ◼ c om Ký tự đại diện (Wildcard) an Ký tự đại diện: ? dùng để hiển thị cho kiểu liệu chưa biết collection ng th ◼ cu u du o 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 ◼ c om Ký tự đại diện (Wildcard) Tuy nhiên viết không hợp lệ u du o ng 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 cu ◼ th an co ng Collection c = new ArrayList(); c.add("a1"); //compile error, null 56 CuuDuongThanCong.com https://fb.com/tailieudientucntt "? extends Type": Xác định tập kiểu Type Đây wildcard hữu ích co ng ◼ c om Ký tự đại diện (Wildcard) th an "? super Type": Xác định tập kiểu cha Type du o ng ◼ u "?": Xác định tập tất kiểu kiểu cu ◼ 57 CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ: ? extends Animal có nghĩa kiểu thuộc loại Animal co ◼ ng ◼ c om Ký tự đại diện (Wildcard) an Hai cú pháp sau tương đương: th ◼ u Dùng "T", thường sử dụng muốn T xuất vị trí khác cu ◼ du o ng public void foo( ArrayList