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
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 đủ
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:
bai_giang_lap_trinh_huong_doi_tuong_bai_8_da_hinh_nguyen_thi.pdf

