Xem mẫu
- 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
om
.c
ng
IT3100
co
an
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
th
o ng
du
Bài 08. Đa hình
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Mục tiêu
om
◼ Giới thiệu về upcasting và downcasting
.c
◼ Phân biệt liên kết tĩnh và liên kết động
ng
Nắm vững kỹ thuật đa hình
co
◼
an
◼ Ví dụ và bài tập về các vấn đề trên với ngôn
ngữ lập trình Java th
o ng
du
u
cu
2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Nội dung
om
1. Upcasting và Downcasting
.c
2. Liên kết tĩnh và Liên kết động
ng
Đa hình (Polymorphism)
co
3.
an
4. Ví dụ và bài tập
th
o ng
du
u
cu
3
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- om
.c
ng
1. Upcasting và Downcasting
co
an
th
o ng
du
u
cu
4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1. Upcasting và Downcasting
om
◼ Chuyển đổi kiểu dữ liệu nguyên thủy
.c
◼ Java tự động chuyển đổi kiểu khi
ng
◼ Kiểu dữ liệu tương thích
co
◼ Chuyển đổi từ kiểu hẹp hơn sang kiểu rộng hơn
an
int i;
th
double d = i; ng
◼ Phải ép kiểu khi
o
Kiểu dữ liệu tương thích
du
◼
◼ Chuyển đổi từ kiểu rộng hơn sang kiểu hẹp hơn
u
cu
int i;
byte b = i; byte b = (byte)i;
5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1. Upcasting và Downcasting
om
◼ Chuyển đổi kiểu dữ liệu tham chiếu
.c
◼ Kiểu dữ liệu tham chiếu có thể được chuyển đổi kiểu khi
ng
◼ Kiểu dữ liệu tham chiếu (lớp) tương thích A
co
◼ Nằm trên cùng một cây phân cấp kế thừa
A var1 = new B();
an
A var1 = new A();
th
ng
B
C var2 = (C)var1;
o
du
◼ Hai cách chuyển đổi
u
Up-casting
cu
◼
“dán cho nó một cái nhãn”
◼ Down-casting
C
6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.1 Upcasting
om
◼ Up casting: đi lên trên cây phân cấp thừa kế
(moving up the inheritance hierarchy)
.c
ng
◼ Up casting là khả năng nhìn nhận đối tượng thuộc
co
lớp dẫn xuất như là một đối tượng thuộc lớp cơ sở.
an
Tự động chuyển đổi kiểu
th
◼ ng
o
du
u
cu
7
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.1 Upcasting
om
◼ Ví dụ:
public class Test1 { Person
.c
public static void main(String arg[]) { - name: String
ng
Employee e = new Employee(); - birthday: Date
co
Person p;
+ setName(String)
p = e;
?
an
+ setBirthday(Date)
p.setName(“Hoa”);
th
+ getDetails(): String
p.setSalary(350000);
ng
// compile error
o
}
du
Employee
- salary: double
u
cu
+ setSalary(double)
+ getDetails(): String
8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.1 Upcasting Person
- name: String
- birthday: Date
om
◼ Ví dụ: + setName(String)
class Manager extends Employee {
.c
+ setBirthday(Date)
Employee assistant; + getDetails(): String
ng
// ...
co
public void setAssistant(Employee e) {
Employee
an
assistant = e;
th
} ng - salary: double
// ... + setSalary(double)
}
o
+ getDetails(): String
du
public class Test2 {
u
public static void main(String arg[]) {
cu
Manager
Manager junior, senior;
- assistant: Employee
// ...
senior.setAssistant(junior); + setAssistant(Employee)
} + getDetails():String
9
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.1 Upcasting Person
- name: String
- birthday: Date
om
◼ Ví dụ: + setName(String)
public class Test3 {
.c
+ setBirthday(Date)
String static teamInfo(Person p1, + getDetails(): String
ng
Person p2) {
co
return "Leader: " + p1.getName() +
Employee
an
", member: " + p2.getName();
th
} ng - salary: double
public static void main(String arg[]) { + setSalary(double)
Employee e1, e2;
o
+ getDetails(): String
du
Manager m1, m2;
u
// ...
cu
Manager
System.out.println(teamInfo(e1, e2));
- assistant: Employee
System.out.println(teamInfo(m1, m2));
System.out.println(teamInfo(m1, e2)); + setAssistant(Employee)
} + getDetails():String
10
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.2 Downcasting
om
◼ Down casting: đi xuống cây phân cấp thừa kế
(move back down the inheritance hierarchy)
.c
ng
◼ Down casting là khả năng nhìn nhận một đối tượng
co
thuộc lớp cơ sở như một đối tượng thuộc lớp dẫn
an
xuất.
Không tự động chuyển đổi kiểu th
ng
◼
o
→ Phải ép kiểu.
du
u
cu
11
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 1.2 Downcasting Person
- name: String
- birthday: Date
om
◼ Ví dụ: + setName(String)
public class Test2 {
.c
+ setBirthday(Date)
public static void main(String arg[]) { + getDetails(): String
ng
Employee e = new Employee();
co
Person p = e; // up casting
Employee
an
Employee e1 = (Employee) p;
th
// down casting ng - salary: double
Manager m = (Manager) ee; + setSalary(double)
// run-time error
o
+ getDetails(): String
du
u
Person p2 = new Manager();
cu
Manager
Employee e2 = (Employee) p2;
- assistant: Employee
}
} + setAssistant(Employee)
+ getDetails():String
12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Toán tử instanceof
om
◼ 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
.c
Trả về: true | false (nếu đối tượng là null thì trả về
ng
◼
co
false)
an
public class Employee extends Person {}
th
public class Student extends Person {}
ng
public class Test{
o
du
public doSomething(Person e) {
u
if (e instanceof Employee) {...
cu
} else if (e instanceof Student) {...
} else {...
}
}
13
} CuuDuongThanCong.com https://fb.com/tailieudientucntt
- om
2. Liên kết tĩnh và liên kết động
.c
ng
(Static binding & dynamic binding)
co
an
th
o ng
du
u
cu
14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Liên kết lời gọi hàm
om
◼ 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
.c
hàm được thực hiện
ng
co
◼ C: đơn giản vì mỗi hàm có duy nhất một tên
an
◼ C++: chồng hàm, phân tích chữ ký kiểm tra danh sách
th
tham số
o ng
du
u
cu
15
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Trong ngôn ngữ Hướng đối tượng
om
◼ Liên kết lời gọi phương thức
.c
◼ Đối với các lớp độc lập (không thuộc cây thừa kế
ng
nào), quy trình này gần như không khác với
co
function call binding
an
so sánh tên phương thức, danh sách tham số để tìm định
th
◼
nghĩa tương ứng
ng
một trong số các tham số là tham số ẩn: con trỏ this
o
◼
du
u
cu
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 2.1 Liên kết tĩnh
om
◼ Liên kết tại thời điểm biên dịch
.c
◼ Early Binding/Compile-time Binding
ng
Lời gọi phương thức được quyết định khi biên
co
◼
dịch, do đó chỉ có một phiên bản của phương
an
thức được thực hiện
th
ng
◼ Nếu có lỗi thì sẽ có lỗi biên dịch
o
du
◼ Ưu điểm về tốc độ
u
C/C++ function call binding, và C++ method
cu
◼
binding cơ bản đều là ví dụ của liên kết tĩnh
(static function call binding)
17
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 2.1 Liên kết tĩnh
om
◼ Thích hợp cho các lời gọi hàm thông thường
.c
◼ Mỗi lời gọi hàm chỉ xác định duy nhất một định
ng
nghĩa hàm, kể cả trường hợp hàm chồng.
co
Phù hợp với các lớp độc lập không thuộc cây
an
◼
th
thừa kế nào ng
Mỗi lời gọi phương thức từ một đối tượng của lớp
o
◼
du
hay từ con trỏ đến đối tượng đều xác định duy
u
nhất một phương thức
cu
18
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 2.2 Liên kết động
om
◼ Lời gọi phương thức được quyết định khi
.c
thực hiện (run-time)
ng
Late binding/Run-time binding
co
◼
Phiên bản của phương thức phù hợp với đối
an
◼
tượng được gọi
th
ng
◼ Java trì hoãn liên kết phương thức cho đến thời
o
du
gian chạy (run-time) - đây được gọi là liên kết
u
động hoặc liên kết trễ
cu
◼ Java mặc định sử dụng liên kết động
19
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- Ví dụ Person
- name: String
- birthday: Date
om
public class Test {
+ setName(String)
public static void main(String arg[]){
.c
+ setBirthday(Date)
Person p = new Person();
+ getDetails(): String
ng
// ...
co
Employee e = new Employee();
Employee
an
// ...
th
Manager m = new Manager(); - salary: double
// ...
ng
+ setSalary(double)
Person pArr[] = {p, e, m};
o
+ getDetails(): String
du
for (int i=0; i< pArr.length; i++){
System.out.println(
u
cu
pArr[i].getDetail()); Manager
} - assistant: Employee
} Tuỳ thuộc vào đối tượng + setAssistant(Employee)
} gọi tại thời điểm thực thi + getDetails():String
chương trình (run-time) 20
CuuDuongThanCong.com https://fb.com/tailieudientucntt
nguon tai.lieu . vn