Chuong 09 - Da hinh
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN Bé m«n C«ng nghÖ phÇn mÒm
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI JAVA
Chương 9. Đa hình (Polymophism)
Chương 9. Đa hình (Polymophism)
1. Upcasting và Downcasting
2. Liên kết tĩnh và Liên kết động
3. Đa hình (Polymophism)
4. Lập trình tổng quát (generic prog.)
Nguyễn Thị Thu Trang [email protected]
1 © Nguyễn Thị Thu Trang, SE-FIT-HUT 2
Chương 9. Đa hình (Polymophism)
1. Upcasting và Downcasting
2. Liên kết tĩnh và Liên kết động
3. Đa hình (Polymophism)
4. Lập trình tổng quát (generic prog.)
2.1. Upcasting
Moving up the inheritance hierarchy
© Nguyễn Thị Thu Trang, SE-FIT-HUT 3
© Nguyễn Thị Thu Trang, SE-FIT-HUT 4
1
Ví dụ
public class Test1 { public static void main(String arg[]){ Person p; Employee e = new Employee(); p = e; p.setName("Hoa"); p.setSalary(350000); // compile error }
Ví dụ (2)
class Manager extends Employee { Employee assistant; // ... public void setAssistant(Employee e) { assistant = e; } // ... } public class Test2 { public static void main(String arg[]){ Manager junior, senior; // ... senior.setAssistant(junior); } }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 5
© Nguyễn Thị Thu Trang, SE-FIT-HUT 6
Ví dụ (3)
public class Test3 { String static teamInfo(Person p1, Person p2){ return "Leader: " + p1.getName() + ", member: " + p2.getName();
2.2. Downcasting
Move back down the inheritance hierarchy
}
public static void main(String arg[]){ Employee e1, e2; Manager m1, m2; // ... System.out.println(teamInfo(e1, e2)); System.out.println(teamInfo(m1, m2)); System.out.println(teamInfo(m1, e2)); }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 7
© Nguyễn Thị Thu Trang, SE-FIT-HUT 8
2
public class Test2 {
Ví dụ
Chương 9. Đa hình (Polymophism)
1. Upcasting và Downcasting
public static void main(String arg[]){ Employee e = new Employee(); Person p = e; // up casting Employee ee = (Employee) p; // down casting Manager m = (Manager) ee; // run-time error
2. Liên kết tĩnh và Liên kết động
3. Đa hình (Polymophism)
4. Lập trình tổng quát (generic prog.)
Person p2 = new Manager(); Employee e2 = (Employee) p2; } }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 9
© Nguyễn Thị Thu Trang, SE-FIT-HUT 10
3.1. Liên kết tĩnh (Static Binding)
Liên kết tại thời điểm biên dịch Early Binding
Ví dụ
public class Test { public static void main(String arg[]){ Person p = new Person(); p.setName("Hoa"); p.setSalary(350000); //compile-time error
} }
Nếu có lỗi thì sẽ có lỗi biên dịch Ưu điểm về tốc độ
© Nguyễn Thị Thu Trang, SE-FIT-HUT 11
© Nguyễn Thị Thu Trang, SE-FIT-HUT 12
3
3.2. Liên kết động (Dynamic binding)
Java mặc định sử dụng kết động Late binding
Ví dụ
public class Test { public static void main(String arg[]){ Person p = new Person(); // ... Employee e = new Employee(); // ... Manager m = new Manager(); // ... Person pArr[] = {p, e, m}; for (int i=0; i< pArr.length; i++){ System.out.println( pArr[i].getDetail());
Run-time binding } } }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 13
© Nguyễn Thị Thu Trang, SE-FIT-HUT 14
Chương 9. Đa hình (Polymophism)
1. Upcasting và Downcasting
2. Liên kết tĩnh và Liên kết động
3. Đa hình (Polymophism)
4. Lập trình tổng quát (generic prog.)
3. Đa hình (Polymophism)
Polymorphism: Nhiều hình thức, nhiều kiểu tồn tại
Đa hình trong lập trình Đa hình phương thức: phương thức trùng tên, phân biệt bởi danh sách tham số. Đa hình đối tượng
© Nguyễn Thị Thu Trang, SE-FIT-HUT 15
© Nguyễn Thị Thu Trang, SE-FIT-HUT 16
4
3. Đa hình (2)
3. Đa hình (3)
Khả năng của một đối tượng của các lớp khác nhau có thể đáp ứng thực hiện các hành vi khác nhau của các lớp khác nhau.
Khả năng giải nghĩa các thông điệp theo các cách thức khác nhau Ví dụ: Person p1 = new Person(); Person p2 = new Employee(); Person p3 = new Manager(); // ... System.out.println(p1.getDetail()); System.out.println(p2.getDetail()); System.out.println(p3.getDetail());
© Nguyễn Thị Thu Trang, SE-FIT-HUT 17
© Nguyễn Thị Thu Trang, SE-FIT-HUT 18
Ví dụ
class EmployeeList { Employee list[]; ... public void add(Employee e) {...} public void print() { for list (int i=0; i<list.length; i++) { System.out.println(list[i].getDetail()); } } ... EmployeeList list = new EmployeeList(); Employee e1; Manager m1; ... list.add(e1); list.add(m1); list.print();
Toán tử instanceof public class Employee extends Person {} public class Student extends Person {}
public doSomething(Person e) { if (e instanceof Employee) {... } else if ( e instanceof Student) {... ){ } else {...} }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 19
© Nguyễn Thị Thu Trang, SE-FIT-HUT 20
5
Chương 9. Đa hình (Polymophism)
1. Upcasting và Downcasting
2. Liên kết tĩnh và Liên kết động
3. Đa hình (Polymophism)
4. Lập trình tổng quát (generic prog.)
4. Lập trình tổng quát (generic programming)
thuật toán đã xác định Ví dụ: C: dùng con trỏ void C++: dùng template Java: lợi dụng upcasting Java 1.5: template
© Nguyễn Thị Thu Trang, SE-FIT-HUT 21
© Nguyễn Thị Thu Trang, SE-FIT-HUT 22
Ví dụ: C dùng con trỏ void
Hàm memcpy: void* memcpy(void* region1, const void* region2, size_t n){ const char* first = (const char*)region2; const char* last = ((const char*)region2) + n; char* result = (char*)region1; while (first != last) *result++ = *first++; return result; }
Ví dụ: C++ dùng template
template<class ItemType> void sort(ItemType A[], int count ) { // Sort count items in the array, A, into increasing order // The algorithm that is used here is selection sort for (int i = count-1; i > 0; i--) { int position_of_max = 0; for (int j = 1; j <= count ; j++) if (A[j] > A[position_of_max]) position_of_max = j; ItemType temp = A[count]; A[count] = A[position_of_max]; A[position_of_max] = temp; } }
© Nguyễn Thị Thu Trang, SE-FIT-HUT 23
© Nguyễn Thị Thu Trang, SE-FIT-HUT 24
6
Ví dụ Java dùng upcasting
class MyStack { ... public void push(Object obj) {...} public Object pop() {...} } ... MyStack s = new MyStack(); Point p = new Point(); Circle c = new Circle(); s.push(p); s.push(c); Circle s c1 = (Circle) s.pop(); Point p1 = (Point) s.pop();
© Nguyễn Thị Thu Trang, SE-FIT-HUT 25
7
Bạn đang đọc truyện trên: Truyen247.Pro