Bài giảng Lập trình hướng đối tượng - Bài 07: Đa hình (Polymophism)

8/24/2011  
Nội dung  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
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  
4. Lập trình tổng quát (generic prog.)  
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG  
Bài 07. Đa hình (Polymophism)  
2
Nội dung  
1.1. Upcasting  
Moving up the inheritance hierarchy  
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
4
Ví dụ  
Ví dụ (2)  
class Manager extends Employee  
Employee assistant;  
// ...  
{
public void setAssistant(Employee e)  
{
assistant  
// ...  
=
e;  
}
public class Test1 {  
public static void main(String arg[]){  
Person p;  
}
public class Test2  
{
public static void main(String arg[]){  
Employee e = new Employee();  
p = e;  
Manager junior, senior;  
// ...  
p.setName(“Hoa”);  
p.setSalary(350000);  
}
senior.setAssistant(junior);  
}
}
5
6
1
8/24/2011  
Ví dụ (3)  
1.2. Downcasting  
public class Test3  
String static teamInfo(Person p1, Person p2){  
{
Move back down the inheritance hierarchy  
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));  
}
}
7
8
Ví dụ  
Nội dung  
public class Test2  
{
public static void main(String arg[]){  
Employee e = new Employee();  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
Person  
p = e;  
Employee ee = (Employee) p;  
Manager  
m
=
=
(Manager) ee;  
new Manager();  
Person p2  
4. Lập trình tổng quát (generic prog.)  
Employee e2 = (Employee) p2;  
Person p3  
=
new Employee();  
Manager e3  
= (Manager) p3;  
}
}
9
10  
Ví dụ  
2.1. Liên kết tĩnh (Static Binding)  
public class Test  
public static void main(String arg[]){  
Person = new Person();  
{
Liên kết tại thời điểm biên dịch  
p
p.setName(“Hoa”);  
p.setSalary(350000);  
}
}
11  
12  
2
8/24/2011  
Ví dụ  
2.2. Liên kết động (Dynamic binding)  
public class Test  
public static void main(String arg[]){  
{
Lời gọi phương thức được quyết định khi  
thực hiện (run-time)  
Person  
// ...  
p
=
new Person();  
Employee  
// ...  
Manager  
// ...  
e
=
new Employee();  
new Manager();  
m
=
Person pArr[]  
= {p, e, m};  
for (int i=0; i< pArr.length; i++){  
System.out.println(  
pArr[i].getDetail());  
}
}
}
13  
14  
Nội dung  
3. Đa hình (Polymophism)  
Ví dụ: Nếu đi du lịch, bạn có thể chọn ô tô, thuyền, hoặc  
máy bay  
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.)  
15  
16  
3. Đa hình (2)  
3. Đa hình (3)  
Đa hình trong lập trình  
Đa hình phương thức:  
Đa hình đối tượng  
17  
18  
3
8/24/2011  
3. Đa hình (4)  
3. Đa hình (5)  
Liên kết động  
Ví dụ:  
public class Test3  
public static void main(String  
{
Person p1 = new Person();  
Person p2 = new Employee();  
Person p3 = new Manager();  
// ...  
args[]){  
Person p1 = new Employee();  
Person p2 = new Manager();  
Employee  
Manager  
e
m
=
(Employee) p1;  
System.out.println(p1.getDetail());  
System.out.println(p2.getDetail());  
System.out.println(p3.getDetail());  
= (Manager) p2;  
}
}
19  
21  
23  
20  
Ví dụ khác  
Toán tử instanceof  
class EmployeeList  
Employee list[];  
...  
public void add(Employee e) {...}  
public void print()  
for (int i=0; i<list.length; i++)  
{
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 {...}  
System.out.println(list[i].getDetail());  
}
}
}
}
...  
EmployeeList list  
Employee e1; Manager m1;  
...  
list.add(e1); list.add(m1);  
list.print();  
=
new EmployeeList();  
22  
Nội dung  
4. Lập trình tổng quát  
4.1. Giới thiệu  
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.2. Java generic data structure  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
24  
4
8/24/2011  
4. Lập trình tổng quát  
4. 1. Giới thiệu về lập trình tổng quát  
C: dùng con trỏ void  
C++: dùng template  
Java: lợi dụng upcasting  
Java 1.5: template  
4.1. Giới thiệu  
4.2. Java generic data structure  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
25  
26  
Ví dụ: C dùng con trỏ void  
Ví dụ: C++ dùng template  
template<class ItemType>  
void* memcpy(void* region1,  
void sort(ItemType A[], int count  
for (int count-1; 0; i--)  
int index_of_max 0;  
for (int 1; <=  
if (A[j] A[index_of_max]) index_of_max  
if (index_of_max != i)  
ItemType temp A[i];  
A[i] A[index_of_max];  
A[index_of_max temp;  
)
{
{
const void* region2, size_t n){  
i
=
i >  
=
j
const char* first  
const char* last  
char* result (char*)region1;  
while (first != last)  
*result++ *first++;  
return result;  
=
(const char*)region2;  
j
=
i ; j++)  
=
((const char*)region2)  
+ n;  
>
= j;  
=
{
=
=
=
]
=
}
}
}
}
27  
28  
Nhắc lại – equals của lớp tự viết  
Ví dụ: Java dùng upcasting và Object  
class MyValue  
{
class MyStack {  
int i;  
}
public class EqualsMethod2  
public static void main(String[] args)  
MyValue v1  
MyValue v2  
...  
public void push(Object obj) {...}  
public Object pop() {...}  
}
{
{
=
=
new MyValue();  
new MyValue();  
public class TestStack{  
MyStack s = new MyStack();  
Point p = new Point();  
Circle c = new Circle();  
s.push(p); s.push(c);  
Circle c1 = (Circle) s.pop();  
Point p1 = (Point) s.pop();  
}
v1.i  
= v2.i = 100;  
System.out.println(v1.equals(v2));  
System.out.println(v1==v2);  
}
}
29  
30  
5
8/24/2011  
Ví dụ: Java 1.5: Template  
Ví dụ: Java 1.5: Template (2)  
List<Integer> myList  
myList.add(new Integer(0));  
Integer myList.iterator().next();  
= new LinkedList<Integer>();  
x
=
List myList = new LinkedList();  
myList.add(new Integer(0));  
Integer  
x = (Integer)  
myList.iterator().next();  
31  
32  
4. Lập trình tổng quát  
4.2.1. Cấu trúc dữ liệu-data structure  
Mảng (Array)  
4.1. Giới thiệu  
4.2. Java generic data structure  
Danh sách liên kết (Linked List)  
Ngăn xếp (Stack)  
Hàng đợi (Queue)  
Cây (Tree)  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
33  
34  
a. Linked List  
a. Linked List (2)  
Khi chèn/xoá một node trên linked list, không phải  
dãn/dồn các phần tử như trên mảng.  
class Node  
{
private int data;  
private Node nextNode;  
// constructors and methods ...  
}
15  
10  
35  
36  
6
8/24/2011  
a. Linked List (3)  
b. Stack  
Stack là một cấu trúc theo kiểu LIFO (Last In  
First Out), phần tử vào sau cùng sẽ được lấy ra  
trước.  
firstNode  
lastNode  
...  
H
D
Q
37  
39  
41  
38  
c. Tree  
d. Queue  
Queue (Hàng đợi) là cấu trúc theo kiểu FIFO  
Nút gốc  
Nút trong  
Nút lá  
40  
e. Binary Search Tree  
e. Binary Search Tree (2)  
Cây nhị phân là cây mà mỗi node không có quá 2  
node con.  
Cây tìm kiếm nhị phân  
Ví dụ về Binary Search Tree  
47  
Cây con trái  
Cây con phải  
25  
77  
11  
43  
65  
68  
93  
7
17  
31 44  
42  
7
8/24/2011  
4. Lập trình tổng quát  
4.2.2. Java Collection Framework  
Collection là đối tượng có khả năng chứa  
các đối tượng khác.  
4.1. Giới thiệu  
4.2. Java generic data structure  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
43  
45  
47  
44  
4.2.2. Java Collection Framework (2)  
Các collection đầu tiên của Java:  
4.2.2. Java Collection Framework (3)  
Một số lợi ích của Collections Framework  
Collections Framework (từ Java 1.2)  
46  
4. Lập trình tổng quát  
4.2.2. Java Collection Framework (4)  
4.1. Giới thiệu  
Collections Framework bao gồm  
Interfaces:  
Implementations:  
Algorithms:  
4.2. Java generic data structure  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection  
framework  
4.2.4. Các cài đặt cho các interface – implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
48  
8
8/24/2011  
4.2.3. Interfaces  
a. Giao diện Collection  
List:  
Set:  
Map:  
<<interface>>  
Collection  
<<interface>>  
Map  
<<interface>>  
<<interface>>  
List  
<<interface>>  
SortedMap  
Set  
<<interface>>  
SortedSet  
49  
51  
53  
50  
b. Giao diện List  
c. Giao diện Set  
Một số phương thức của List  
Object get(int index);  
Object set(int index, Object o);  
void add(int index, Object o);  
Object remove(int index);  
int indexOf(Object o);  
Set kế thừa từ Collection  
int lastIndexOf(Object o);  
52  
d. Giao diện SortedSet  
SortedSet kế thừa từ Set  
Một số phương thức của SortedSet:  
Object first();  
Object last  
SortedSet subSet(Object e1, Object e2);  
Collection,  
Set và List  
54  
9
8/24/2011  
e. Duyệt collection  
e. Duyệt collection (2)  
Iterator  
Các phương thức của Iterator:  
boolean hasNext();  
Object next();  
void remove();  
Collection c;  
Iterator it = c.iterator();  
while ( it.hasNext() ) {  
Point p = (Point) it.next();  
System.out.println( p.toString() );  
}
...  
Iterator it = c.iterator();  
55  
57  
59  
56  
f. Giao diện Iterator  
f. Giao diện Iterator (2) - Ví dụ  
Collection c;  
// Some code to build the  
collection  
Iterator i = c.iterator();  
while (i.hasNext()) {  
Object o = i.next();  
// Process this object  
}
58  
g. Giao diện Map  
g. Giao tiếp Map (2)  
Map cung cấp 3 cách view dữ liệu  
Xác định giao diện cơ bản để thao tác với  
một tập hợp bao gồm cặp khóa-giá trị  
60  
10  
8/24/2011  
h. Giao diện SortedMap  
4. Lập trình tổng quát  
Giao diện SortedMap kế thừa từ Map, nó cung cấp thao  
tác trên các bảng ánh xạ với khoá có thể so sánh được.  
4.1. Giới thiệu  
4.2. Java generic data structure  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface –  
implementation  
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
61  
62  
4.2.4. Implementations  
4.2.4. Implementations (2)  
LinkedList  
List  
Các cài đặt trong Collections Framework chính là các  
lớp collection có sẵn trong Java.  
ArrayList  
HashSet  
LinkedHashSet  
SortedSet  
Set  
TreeSet  
HashMap  
LinkedHashMap  
SortedMap  
Map  
TreeMap  
63  
64  
4.2.4. Implementations (3) -Mô tả các cài  
đặt  
4.2.4. Implementations (3) -Mô tả các cài  
đặt  
ArrayList:  
LinkedList  
HashSet:  
LinkedHashSet:  
TreeSet:  
HashMap:  
LinkedHashMap:  
TreeMap:  
65  
66  
11  
8/24/2011  
public class MapExample  
public static void main(String args[])  
Map map new HashMap();  
Integer ONE new Integer(1);  
for (int i=0, n=args.length; i<n; i++)  
String key args[i];  
Integer frequency =(Integer)map.get(key);  
if (frequency == null) frequency ONE;  
else  
{
{
4.2.4. Implementations (3) – Tổng kết  
=
=
{
=
{
=
}
{
int value  
frequency  
=
=
frequency.intValue();  
new Integer(value 1);  
+
}
map.put(key, frequency);  
}
System.out.println(map);  
Map sortedMap new TreeMap(map);  
System.out.println(sortedMap);  
=
}
68  
}
4. Lập trình tổng quát  
4.3. Định nghĩa và sử dụng Template  
4.1. Giới thiệu  
4.2. Java generic data structure  
class MyStack<T> {  
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
...  
public void push(T x) {...}  
public T pop() {  
...  
4.2.4. Các cài đặt cho các interface – implementation  
}
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
}
69  
70  
Sử dụng template  
Định nghĩa Iterator  
public class Test  
public static void main(String args[])  
{
public interface List<E>{  
void add(E x);  
{
MyStack<Integer> s1  
s1.push(new Integer(0));  
Integer s1.pop();  
= new MyStack<Integer>();  
Iterator<E> iterator();  
}
x
=
//s1.push(new Long(0));  
Error  
public interface Iterator<E>{  
E next();  
MyStack<Long> s2  
s2.push(new Long(0));  
Long s2.pop();  
= new MyStack<Long>();  
boolean hasNext();  
y
=
}
}
class LinkedList<E> implements List<E> {  
}
// implementation  
}
71  
72  
12  
8/24/2011  
4. Lập trình tổng quát  
4.4. Ký tự đại diện (Wildcard)  
public class Test  
public static void main(String args[])  
List<String> lst0 new LinkedList<String>();  
//List<Object> lst1 lst0; Error  
//printList(lst0); Error  
{
4.1. Giới thiệu  
4.2. Java generic data structure  
{
=
=
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
}
void printList(List<Object> lst)  
Iterator it = lst.iterator();  
while (it.hasNext())  
{
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
System.out.println(it.next());  
}
}
73  
75  
77  
74  
76  
78  
Ví dụ: Sử dụng Wildcards  
Các ký tự đại diện Java 1.5  
public class Test  
{
void printList(List<?> lst)  
{
"? extends Type”.  
"? super Type”  
"?“  
Iterator it = lst.iterator();  
while (it.hasNext())  
System.out.println(it.next());  
}
public static void main(String args[])  
List<String> lst0  
new LinkedList<String>();  
{
=
List<Employee> lst1  
=
new LinkedList<Employee>();  
printList(lst0);  
printList(lst1);  
// String  
// Employee  
}
}
Ví dụ wildcard (1)  
Ví dụ wildcard (2)  
public void printCollection(Collection c)  
Iterator i = c.iterator();  
{
public void draw(List<Shape> shape) {  
for(Shape s: shape)  
{
for(int  
k
=
0;k<c.size();k++)  
{
s.draw(this);  
}
System.out.println(i.next());  
}
}
}
Sử dụng wildcard:  
void printCollection(Collection<?> c)  
{
for(Object o:c)  
{
System.out.println(o);  
}
}
13  
pdf 13 trang baolam 25560 Free
Bạn đang xem tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 07: Đa hình (Polymophism)", để 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_07_da_hinh_polymophi.pdf