Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

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