Bài giảng Lập trình hướng đối tượng - Bài 8: Đa hình - Nguyễn Thị Thu Trang

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  
IT3100  
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG  
Bài 08. Đa hình  
Mục tiêu  
◼ Giới thiệu về upcasting và downcasting  
◼ Phân biệt liên kết tĩnh và liên kết động  
◼ Nắm vững kỹ thuật đa hình  
◼ Ví dụ và bài tập về các vấn đề trên với ngôn  
ngữ lập trình Java  
2
Nội dung  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymorphism)  
4. Ví dụ và bài tập  
3
1. Upcasting và Downcasting  
4
1. Upcasting và Downcasting  
◼ 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
1. Upcasting và Downcasting  
◼ 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  
A
◼
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  
A var1 = new B();  
A var1 = new A();  
C var2 = (C)var1;  
B
◼
Hai cách chuyển đổi  
◼
Up-casting  
“dán cho nó một cái nhãn”  
◼
Down-casting  
C
6
1.1 Upcasting  
◼ 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
1.1 Upcasting  
◼ Ví dụ:  
public class Test1 {  
public static void main(String arg[]) {  
Employee e = new Employee();  
Person p;  
Person  
- name: String  
- birthday: Date  
+ setName(String)  
+ setBirthday(Date)  
+ getDetails(): String  
p = e;  
p.setName(“Hoa”);  
p.setSalary(350000);  
// compile error  
?
}
Employee  
- salary: double  
+ setSalary(double)  
+ getDetails(): String  
8
Person  
1.1 Upcasting  
- name: String  
- birthday: Date  
◼ Ví dụ:  
+ setName(String)  
+ setBirthday(Date)  
+ getDetails(): String  
class Manager extends Employee {  
Employee assistant;  
// ...  
public void setAssistant(Employee e) {  
Employee  
- salary: double  
assistant = e;  
}
+ setSalary(double)  
+ getDetails(): String  
// ...  
}
public class Test2 {  
public static void main(String arg[]) {  
Manager  
Manager junior, senior;  
- assistant: Employee  
+ setAssistant(Employee)  
+ getDetails():String  
// ...  
senior.setAssistant(junior);  
}
}
9
Person  
1.1 Upcasting  
- name: String  
- birthday: Date  
◼ Ví dụ:  
+ setName(String)  
+ setBirthday(Date)  
+ getDetails(): String  
public class Test3 {  
String static teamInfo(Person p1,  
Person p2) {  
return "Leader: " + p1.getName() +  
", member: " + p2.getName();  
Employee  
- salary: double  
}
+ setSalary(double)  
+ getDetails(): String  
public static void main(String arg[]) {  
Employee e1, e2;  
Manager m1, m2;  
// ...  
Manager  
System.out.println(teamInfo(e1, e2));  
System.out.println(teamInfo(m1, m2));  
System.out.println(teamInfo(m1, e2));  
}
- assistant: Employee  
+ setAssistant(Employee)  
+ getDetails():String  
10  
}
1.2 Downcasting  
◼ 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.  
11  
Person  
1.2 Downcasting  
- name: String  
- birthday: Date  
◼ Ví dụ:  
+ setName(String)  
+ setBirthday(Date)  
+ getDetails(): String  
public class Test2 {  
public static void main(String arg[]) {  
Employee e = new Employee();  
Person p = e; // up casting  
Employee e1 = (Employee) p;  
// down casting  
Employee  
- salary: double  
+ setSalary(double)  
+ getDetails(): String  
Manager m = (Manager) ee;  
// run-time error  
Person p2 = new Manager();  
Manager  
Employee e2 = (Employee) p2;  
- assistant: Employee  
+ setAssistant(Employee)  
}
}
+ getDetails():String  
12  
Toán tử instanceof  
◼ 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  
◼ Trả về: true | false (nếu đối tượng là null thì trả về  
false)  
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 {...  
}
}
13  
}
2. Liên kết tĩnh và liên kết động  
(Static binding & dynamic binding)  
14  
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ố  
15  
Trong ngôn ngữ Hướng đối tượng  
◼ 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  
bar.foo (); → lời gọi  
này bị ràng buộc với định  
nghĩa của phương thức  
mà nó gọi  
16  
2.1 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)  
17  
2.1 Liên kết tĩnh  
◼ Thích hợp cho các lời gọi hàm thông thường  
◼
Mỗi lời gọi hàm chỉ xác định duy nhất một định  
nghĩa hàm, kể cả trường hợp hàm chồng.  
◼ Phù hợp với các lớp độc lập không thuộc cây  
thừa kế nào  
◼
Mỗi lời gọi phương thức từ một đối tượng của lớp  
hay từ con trỏ đến đối tượng đều xác định duy  
nhất một phương thức  
18  
2.2 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 trì hoãn liên kết phương thức cho đến thời  
gian chạy (run-time) - đây được gọi là liên kết  
động hoặc liên kết trễ  
◼
Java mặc định sử dụng liên kết động  
19  
Person  
Ví dụ  
- name: String  
- birthday: Date  
public class Test {  
public static void main(String arg[]){  
Person p = new Person();  
// ...  
+ setName(String)  
+ setBirthday(Date)  
+ getDetails(): String  
Employee e = new Employee();  
// ...  
Employee  
- salary: double  
Manager m = new Manager();  
// ...  
+ setSalary(double)  
+ getDetails(): String  
Person pArr[] = {p, e, m};  
for (int i=0; i< pArr.length; i++){  
System.out.println(  
pArr[i].getDetail());  
}
Manager  
- assistant: Employee  
+ setAssistant(Employee)  
Tuỳ thuộc vào đối tượng  
gọi tại thời điểm thực thi  
chương trình (run-time)  
}
+ getDetails():String  
}
20  
Tải về để xem bản đầy đủ
pdf 40 trang yennguyen 22340 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 8: Đa hình - Nguyễn Thị Thu Trang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_bai_8_da_hinh_nguyen_thi.pdf