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
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:
bai_giang_lap_trinh_huong_doi_tuong_bai_07_da_hinh_polymophi.pdf

