Bài giảng môn Lập trình hướng đối tượng: Bài 9 - Lập trình tổng quát

68 4 0
Bài giảng môn Lập trình hướng đối tượng: Bài 9 - Lập trình tổng quát

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng Lập trình hướng đối tượng: Bài 9 - Lập trình tổng quát được biên soạn bao gồm các nội dung chính sau: 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.

Bài 9: Lập trình tổng quát 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 Nội dung Giới thiệu lập trình tổng quát Định nghĩa sử dụng Template Lập trình tổng quát Java collections framework Ký tự đại diện (Wildcard) Ví dụ tập Nội dung Giới thiệu lập trình tổng quát Định nghĩa sử dụng Template Lập trình tổng quát Java collections framework Ký tự đại diện (Wildcard) Ví dụ tập Giới thiệu lập trình tổng qt ❖ Lập trình tổng qt(Generic programming): 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 ▪ Thuật tốn xác định ❖ Ví dụ: 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,… 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ý Giới thiệu lập trình tổng quát ❖ Lập trình tổng quát ▪ 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, downcasting lớp object ▪ Java 1.5: đưa khái niệm template 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 Giới thiệu lập trình tổng qt ❖ Ví dụ: Lập trình tổng quát 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!!! Giới thiệu lập trình tổng qt ❖ 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 Nội dung Giới thiệu lập trình tổng quát Định nghĩa sử dụng Template Lập trình tổng quát Java collections framework Ký tự đại diện (Wildcard) Ví dụ tập 10 Giao diện Iterator Comparator ❖ Ví dụ Sử dụng AgeComparator : System.out.println("Order before sorting"); for (Person person : lst) { System.out.println(person.getName() + "\t" + person.getAge()); } Collections.sort(lst, new AgeComparator()); System.out.println("\n\nOrder of person" + "after sorting by age"); for (Iterator i = lst.iterator(); i.hasNext();) { Person person = i.next(); System.out.println(person.getName() + "\t" + person.getAge()); } //End of for } //End of main } //End of class 54 Nội dung Giới thiệu lập trình tổng quát Định nghĩa sử dụng Template Lập trình tổng quát Java collections framework Ký tự đại diện (Wildcard) Ví dụ tập 55 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 (sử dụng phương thức add) ▪ Tuy nhiên, ArrayList, ArrayList lại khơng có quan hệ với ArrayList 56 Ký tự đại diện (Wildcard) ❖ Không thể ép kiểu ArrayList kiểu ArrayList class Parent { } class Child extends Parent { } ArrayList myList = new ArrayList(); 57 Ví dụ public class Test { public static void main(String args[]) { List lst0 = new LinkedList(); List lst1 = lst0; // Error printList(lst0); // Error } void static printList(List lst) { Iterator it = lst.iterator(); while (it.hasNext()) System.out.println(it.next()); } } 58 Ký tự đại diện (Wildcard) ❖ 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 ❖ Khi biên dịch, dấu ? thay kiểu liệu 59 Ví dụ: Sử dụng Wildcards public class Test { void printList(List lst) { Iterator it = lst.iterator(); while (it.hasNext()) System.out.println(it.next()); } public static void main(String args[]) { List lst0 = new LinkedList(); List lst1 = new LinkedList(); printList(lst0); // String printList(lst1); // Employee } } 60 Ký tự đại diện (Wildcard) ❖ Lưu ý: cách làm sau không hợp lệ ArrayList list = new ArrayList(); list.add("a1"); //compile error list.add(new Object()); //compile error ❖ Ngun nhân: Vì khơng biết list danh sách liên kết cho kiểu liệu nào, nên thêm phần tử vào list, kể đối tượng lớp Object 61 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 62 Ký tự đại diện (Wildcard) ❖ Ví dụ: ▪ ? extends Animal có nghĩa kiểu thuộc loại Animal (là Animal Animal) ❖ Lưu ý: Hai cú pháp sau tương đương: public void foo( ArrayList

Ngày đăng: 26/01/2023, 17:44

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan