Bài giảng Lập trình hướng đối tượng - Bài 8: Đa hình - Trịnh Thành Trung

Tóm tắt Bài giảng Lập trình hướng đối tượng - Bài 8: Đa hình - Trịnh Thành Trung: ...Birthday(Date) + getDetails(): String Employee - salary: double + setSalary(double) + getDetails(): String Manager - assistant: Employee + setAssistant(Employee) + getDetails():String 10 • Down casting: đi xuống cây phân cấp thừa kế (move back down the inheritance hierarchy) ... nghĩa tương ứng −một trong số các tham số là tham số ẩn: con trỏ this 15 Liên kết tĩnh • Liên kết tại thời điểm biên dịch − Early Binding/Compile-time Binding − Lời gọi phương thức được quyết định khi biên dịch, do đó chỉ có một phiên bản của phương thức được thực hiện − Nếu có lỗ... thông điệp có giải nghĩa thông điệp theo cách thức khác nhau. Đa hình 20 Ví dụ • Các đối tượng khác nhau giải nghĩa các thông điệp theo các cách thức khác nhau • Liên kết động (Java) Person p1 = new Person(); Person p2 = new Employee(); Person p3 = new Manager(); // ... Sy...

pdf26 trang | Chia sẻ: havih72 | Lượt xem: 366 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Lập trình hướng đối tượng - Bài 8: Đa hình - Trịnh Thành Trung, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài 8 
Đa hình 
Trịnh Thành Trung 
trungtt@soict.hust.edu.vn 
Nội dung 
1. Upcasting và 
downcasting 
2. Đa hình 
3. Liên kết tĩnh và liên kết 
động 
Up-casting và down-casting 
Chuyển đổi kiểu dữ liệu đối tượng 
1 
4 
Chuyển đổi kiểu dữ liệu nguyên 
thủy 
• Java tự động chuyển đổi kiểu khi 
− Kiểu dữ liệu tương thích 
− Chuyển đổi từ kiểu hẹp hơn sang kiểu rộng hơn 
int i; 
double d = i; 
• Phải ép kiểu khi 
− Kiểu dữ liệu tương thích 
− Chuyển đổi từ kiểu rộng hơn sang kiểu hẹp hơn 
int i; 
byte b = i; byte b = (byte)i; 
5 
Chuyển đổi kiểu dữ liệu tham 
chiếu 
• Kiểu dữ liệu tham chiếu có thể được 
chuyển đổi kiểu khi 
• Kiểu dữ liệu tham chiếu (lớp) tương thích 
• Nằm trên cùng một cây phân cấp kế thừa 
• Hai cách chuyển đổi 
• Up-casting 
• Down-casting 
A 
B 
C 
6 
Up-casting 
• Up casting: đi lên trên cây phân cấp thừa kế 
(moving up the inheritance hierarchy) 
• Up casting là khả năng nhìn nhận đối tượng 
thuộc lớp dẫn xuất như là một đối tượng thuộc 
lớp cơ sở. 
• Tự động chuyển đổi kiểu 
7 
Ví dụ 
public class Test1 { 
 public static void main(String arg[]) { 
 Employee e = new Employee(); 
 Person p; 
 p = e; 
 p.setName(“Hoa”); 
 p.setSalary(350000); 
 // compile error 
} 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
8 
Ví dụ 
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); 
 } 
} 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
9 
Ví dụ 
public class Test3 { 
 String static teamInfo(Person p1, Person p2) { 
 return "Leader: " + p1.getName() + 
 ", member: " + p2.getName(); 
 } 
 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)); 
 } 
} 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
10 
• Down casting: đi xuống cây phân cấp thừa kế 
(move back down the inheritance hierarchy) 
• Down casting là khả năng nhìn nhận một đối 
tượng thuộc lớp cơ sở như một đối tượng thuộc 
lớp dẫn xuất. 
• Không tự động chuyển đổi kiểu 
  Phải ép kiểu. 
Down-casting 
11 
Ví dụ 
public class Test2 { 
 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 
 Person p2 = new Manager(); 
 Employee e2 = (Employee) p2; 
 } 
} 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
Liên kết tĩnh và liên kết 
động 
Static binding & dynamic binding 
2 
13 
Liên kết lời gọi hàm 
• Liên kết lời gọi hàm (function call binding) là quy 
trình xác định khối mã hàm cần chạy khi một lời 
gọi hàm được thực hiện 
• C: đơn giản vì mỗi hàm có duy nhất một tên 
• C++: chồng hàm, phân tích chữ ký kiểm tra danh 
sách tham số. 
14 
Trong ngôn ngữ HĐT 
• Liên kết lời gọi phương thức 
• Đối với các lớp độc lập (không thuộc cây thừa kế 
nào), quy trình này gần như không khác với 
function call binding 
− so sánh tên phương thức, danh sách tham số để tìm định 
nghĩa tương ứng 
−một trong số các tham số là tham số ẩn: con trỏ this 
15 
Liên kết tĩnh 
• Liên kết tại thời điểm biên dịch 
− Early Binding/Compile-time Binding 
− Lời gọi phương thức được quyết định khi biên dịch, do 
đó chỉ có một phiên bản của phương thức được thực 
hiện 
− Nếu có lỗi thì sẽ có lỗi biên dịch 
− Ưu điểm về tốc độ 
• C/C++ function call binding, và C++ method 
binding cơ bản đều là ví dụ của liên kết tĩnh 
(static function call binding) 
16 
Liên kết động 
• Lời gọi phương thức được quyết định khi thực 
hiện (run-time) 
− Late binding/Run-time binding 
− Phiên bản của phương thức phù hợp với đối tượng được 
gọi. 
− Java mặc định sử dụng liên kết động 
17 
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()); 
 } 
 } 
} 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
Đa hình 
Polymorphism 
3 
19 
• Polymorphism: Nhiều hình thức thực hiện, 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 
+ Nhìn nhận đối tượng theo nhiều kiểu khác nhau 
+ Các đối tượng khác nhau cùng đáp ứng chung danh sách các 
thông điệp có giải nghĩa thông điệp theo cách thức khác 
nhau. 
Đa hình 
20 
Ví dụ 
• Các đối tượng khác nhau giải nghĩa 
các thông điệp theo các cách thức 
khác nhau 
• Liên kết động (Java) 
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()); 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
21 
Ví dụ 
 class EmployeeList { 
 Employee list[]; 
 ... 
 public void add(Employee e) {...} 
 public void print() { 
 for (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(); 
Person 
- name: String 
- birthday: Date 
+ setName(String) 
+ setBirthday(Date) 
+ getDetails(): String 
Employee 
- salary: double 
+ setSalary(double) 
+ getDetails(): String 
Manager 
- assistant: Employee 
+ setAssistant(Employee) 
+ getDetails():String 
• Kiểm tra xem một đối tượng có phải là thể 
hiện của một lớp nào đó không 
public class Employee extends Person {} 
public class Student extends Person {} 
public class Test{ 
 public doSomething(Person e) { 
 if (e instanceof Employee) {... 
 } else if (e instanceof Student) {... 
 } else {... 
 } 
 } 
} 
Toán tử instanceof 
23 
Ví dụ 
• Các đối tượng Triangle, Rectangle, Circle đều là 
các đối tượng Shape 
... 
public static void handleShapes(Shape[] shapes){ 
 // Vẽ các hình theo cách riêng của mỗi hình 
 for( int i = 0; i < shapes.length; ++i) { 
 shapes[i].draw(); 
 } 
 ... 
 // Gọi đến phương thức xóa, không cần quan tâm 
 // đó là hình gì 
 for( int i = 0; i < shapes.length; ++i) { 
 shapes[i].erase(); 
 } 
} 
... 
Ví dụ 
Tổng kết 
• Upcasting và downcasting 
• Nhìn nhận các đối tượng thuộc lớp cơ sở như đối 
tượng thuộc lớp dẫn xuất (upcasting) và ngược lại 
(down-casting) 
• Liên kết tĩnh và liên kết động 
• Liên kết lời gọi hàm lúc biên dịch (liên kết tĩnh) 
hay lúc chạy chương trình (liên kết động) 
• Đa hình 
• Nhìn nhận một đối tượng dưới nhiều kiểu khác 
nhau 
Thank you! 
Any questions? 

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_bai_8_da_hinh_trinh_than.pdf