Bài giảng Lập trình hướng đối tượng - Bài 7: Đa hình (Polymophism)
9/18/17
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
n 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)
n 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ở.
4. Lập trình tổng quát (generic prog.)
n Tự động chuyển đổi kiểu
3
4
1
9/18/17
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;
p.setName(“Hoa”);
Manager junior, senior;
// ...
senior.setAssistant(junior);
// compile error
p.setSalary(350000);
}
}
}
5
6
Ví dụ (3)
1.2. Downcasting
public class Test3 {
n Move back down the inheritance hierarchy
String static teamInfo(Person p1, Person p2){
return "Leader: " + p1.getName() +
", member: " + p2.getName();
}
n 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.
public static void main(String arg[]){
Employee e1, e2;
n Không tự động chuyển đổi kiểu
à Phải ép kiểu.
Manager m1, m2;
// ...
System.out.println(teamInfo(e1, e2));
System.out.println(teamInfo(m1, m2));
System.out.println(teamInfo(m1, e2));
}
}
7
8
2
9/18/17
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; // up casting
Employee ee = (Employee) p; // down casting
Manager m = (Manager) ee; // run-time error
4. Lập trình tổng quát (generic prog.)
Person p2 = new Manager();
Employee e2 = (Employee) p2;
Person p3 = new Employee();
Manager e3 = (Manager) p3;
}
}
9
10
2.1. Liên kết tĩnh (Static Binding)
Ví dụ
public class Test {
n Liên kết tại thời điểm biên dịch
public static void main(String arg[]){
n
Early Binding/Compile-time Binding
Person p = new Person();
p.setName(“Hoa”);
p.setSalary(350000); //compile-time error
n
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
n
Nếu có lỗi thì sẽ có lỗi biên dịch
Ưu điểm về tốc độ
11
12
3
9/18/17
Ví dụ
2.2. Liên kết động (Dynamic binding)
public class Test {
public static void main(String arg[]){
n Lời gọi phương thức được quyết định khi
Person p = new Person();
// ...
thực hiện (run-time)
Employee e = new Employee();
// ...
Manager m = new Manager();
// ...
Person pArr[] = {p, e, m};
for (int i=0; i< pArr.length; i++){
System.out.println(
n
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.
n
n
Java mặc định sử dụng liên kết động
pArr[i].getDetail());
}
}
}
13
14
Nội dung
3. Đa hình (Polymophism)
n Ví dụ: Nếu đi du lịch, bạn có thể chọn ô tô, thuyền, hoặc
1. Upcasting và Downcasting
máy bay
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.)
n
Dù đi bằng phương tiện gì, kết quả cũng giống nhau là
bạn đến được nói cần đến
n
Cách thức đáp ứng các dịch vụ có thể khác nhau
15
16
4
9/18/17
3. Đa hình (2)
3. Đa hình (3)
n Các lớp khác nhau có thể đáp ứng danh sách các thông điệp
n Polymorphism: Nhiều hình thức thực hiện,
giống nhau, vì vậy cung cấp các dịch vụ giống nhau
nhiều kiểu tồn tại
n
Cách thức đáp ứng
thông điệp, thực hiện
dịch vụ khác nhau
n Đa hình trong lập trình
n
Đa hình phương thức:
n
Chúng có thể tráo đổi
cho nhau mà không
ảnh hưởng đến đối
tượng gửi thông điệp
n
Phương thức trùng tên, phân biệt bởi danh sách tham
số.
n
Đa hình đối tượng
n
Nhìn nhận đối tượng theo nhiều kiểu khác nhau
n
à Đa hình
n
Các đối tượng khác nhau cùng đáp ứng chung danh
sách các thông điệp có giải nghĩa thông điệp theo
cách thức khác nhau.
17
18
3. Đa hình (4)
3. Đa hình (5)
n Nhìn nhận đối tượng theo nhiều
kiểu khác nhau à Upcasting và
Downcasting
n Các đối tượng khác nhau giải nghĩa các
thông điệp theo các cách thức khác nhau à
Liên kết động
public class Test3 {
n Ví dụ:
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 e = (Employee) p1;
Manager m = (Manager) p2;
System.out.println(p1.getDetail());
System.out.println(p2.getDetail());
System.out.println(p3.getDetail());
}
}
19
20
5
9/18/17
Ví dụ khác
Toán tử instanceof
class EmployeeList {
Employee list[];
public class Employee extends Person {}
public class Student extends Person {}
...
public void add(Employee e) {...}
public void print() {
for (int i=0; i<list.length; i++) {
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 = new EmployeeList();
Employee e1; Manager m1;
...
list.add(e1); list.add(m1);
list.print();
21
22
Static Binding và Polymorphism
Dynamic Binding và Polymorphism
n
n
Abstract Class
Overriding:
n Function/Method Overloading
n
Java: mặc định phương thức lớp con trùng chữ ký lớp cha à là overriding
n Constructor Overloading: là 1 thể hiện của
function overloading
n Operator Overloading
n
C#: Muốn overriding một phương thức ảo hoặc trừu tượng thuộc lớp cha phải dùng từ
khoá override
n
C++: phương thức của lớp dẫn xuất cùng kí hiệu với phương thức được khai báo với
từ khoá virtual trong lớp cha à nó overriding phương thức của lớp cha (tương tự
Java)
n
Abstract Method và Virtual Method
n
Abstract method: là p/thức chỉ có khai báo interface, không có cài đặt. Lớp dẫn xuất
từ lớp có các abstract method phải implement tất cả các phương thức loại này. Java,
C#: dùng từ khóa abstract
n C# và C++ cư xử với hàm định nghĩa chồng
theo cơ chế static binding trong khi Java cư
xử theo cơ chế dynamic binding
n
Virtual method: Là p/thức có thể bị overridden trong lớp dẫn xuất và phải có cài đặt
trong lớp cơ sở. Lớp dẫn xuất có thể không cần overriding p/thức này.
n
Java: mặc định mọi phương thức đều là virtual (trừ final)
n
C#: khai báo dùng từ khóa virtual. Dùng từ khóa override cho phương thức ghi đè ở lớp dẫn
xuất.
n
Riêng với C#, nếu bỏ 2 từ khóa à che được phương thức lớp cha. Để tránh warning, dùng từ khóa
new chỉ tường minh (chuyển thành static binding)
23
24
n
C++: khai báo dùng từ khóa virtual. Ý nghĩa như Java, mặc định bị ghi đè, không che được
6
9/18/17
Nội dung
4. Lập trình tổng quát
n 4.1. Giới thiệu
n 4.2. Java generic data structure
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.)
n
n
n
n
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
n 4.3. Định nghĩa và sử dụng Template
n 4.4. Ký tự đại diện (Wildcard)
25
26
4. Lập trình tổng quát
4. 1. Giới thiệu về lập trình tổng quát
n Tổng quát hóa chương trình để có thể hoạt
động với các kiểu dữ liệu khác nhau, kể cả
kiểu dữ liệu trong tương lai
n
4.1. Giới thiệu
4.2. Java generic data structure
n
n
n
n
n
4.2.1. Data structure
n
thuật toán đã xác định
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
n Ví dụ:
n
n
n
n
C: dùng con trỏ void
C++: dùng template
Java: lợi dụng upcasting
Java 1.5: template
n
n
4.3. Định nghĩa và sử dụng Template
4.4. Ký tự đại diện (Wildcard)
27
28
7
9/18/17
Ví dụ: C dùng con trỏ void
Ví dụ: C++ dùng template
template<class ItemType>
void sort(ItemType A[], int
// Sort count items in the arr
// The algorithm that is us
for (int i = count-1; i > 0; i--) {
int index_of_max = 0;
for (int j = 1; j <= i ; j++)
if (A[j] > A[index_of_max]) index_of_max = j;
if (index_of_max != i) {
ItemType temp = A[i];
A[i] = A[index_of_max];
A[index_of_max ] = temp;
}
Khi sử dụng,có thể thay thế
ItemType bằng int, string,… hoặc
bất kỳ một đối tượng của một lớp
n Hàm memcpy:
void* memcpy(void* region1,
const void* region2, size_t n){
nào đó
const char* first = (const char*)region2;
const char* last = ((const char*)region2) + n;
char* result = (char*)region1;
while (first != last)
*result++ = *first++;
return result;
}
}
}
29
30
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 void push(Object obj) {...}
public Object pop() {...}
}
public class EqualsMethod2 {
public static void main(String[] args) {
MyValue v1 = new MyValue();
MyValue v2 = new MyValue();
v1.i = v2.i = 100;
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();
}
System.out.println(v1.equals(v2));
System.out.println(v1==v2);
}
}
31
32
8
9/18/17
class MyValue {
Bài tập
int i;
public boolean equals(Object obj) {
n Viết lại phương thức equals cho lớp MyValue
return (this.i == ((MyValue) obj).i);
}
(phương thức này kế thừa từ lớp Object)
}
public class EqualsMethod2 {
public static void main(String[] args) {
MyValue v1 = new MyValue();
MyValue v2 = new MyValue();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
System.out.println(v1==v2);
}
}
34
Ví dụ: Java 1.5: Template
Ví dụ: Java 1.5: Template (2)
n
Dùng Template:
List<Integer> myList = new LinkedList<Integer>();
myList.add(new Integer(0));
Integer x = myList.iterator().next();
//myList.add(new Long(0));
à
Error
n Không dùng Template
List myList = new LinkedList();
myList.add(new Integer(0));
Integer x = (Integer)
myList.iterator().next();
35
36
9
9/18/17
4. Lập trình tổng quát
4.2.1. Cấu trúc dữ liệu-data structure
n Cấu trúc dữ liệu là cách tổ chức dữ liệu để
n
n
4.1. Giới thiệu
4.2. Java generic data structure
giải quyết vấn đề.
n
n
n
n
4.2.1. Data structure
n Một số cấu trúc dữ liệu phổ biến:
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
n
n
n
n
n
Mảng (Array)
Danh sách liên kết (Linked List)
Ngăn xếp (Stack)
Hàng đợi (Queue)
Cây (Tree)
n
n
4.3. Định nghĩa và sử dụng Template
4.4. Ký tự đại diện (Wildcard)
37
38
a. Linked List
a. Linked List (2)
n Linked list là cấu trúc gồm các node liên kết với nhau
thông qua các mối liên kết. Node cuối linked list
được đặt là null để đánh dấu kết thúc danh sách.
n
Thể hiện Node thông qua lớp tự tham chiếu (self-
referential class)
class Node
n Linked list giúp tiết kiệm bộ nhớ so với mảng trong
{
private int data;
private Node nextNode;
// constructors and methods ...
các bài toán xử lý danh sách.
n 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.
}
n Việc truy nhập trên linked list luôn phải tuần tự.
15
10
39
40
10
9/18/17
a. Linked List (3)
b. Stack
n
n
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.
n Một linked list được quản lý bởi tham chiếu tới node
đầu và node cuối.
Hai thao tác cơ bản trên Stack
firstNode
lastNode
n
Chèn phần tử: Luôn chèn vào đỉnh Stack
(push)
n
Lấy ra phần tử: Luôn lấy ra từ đỉnh Stack
(pop)
...
H
D
Q
41
42
c. Tree
d. Queue
n Tree là một cấu trúc phi tuyến (non-linear).
n
n
Queue (Hàng đợi) là cấu trúc theo kiểu FIFO
(First In First Out), phần tử vào trước sẽ được
lấy ra trước.
n Mỗi node trên cây có thể có nhiều liên kết tới node
khác.
Nút gốc
Hai thao tác cơ bản trên hàng đợi
n
Chèn phần tử: Luôn chèn vào cuối hàng đợi
(enqueue)
Nút trong
n
Lấy ra phần tử: Lấy ra từ đầu hàng đợi
(dequeue)
Nút lá
43
44
11
9/18/17
e. Binary Search Tree
e. Binary Search Tree (2)
n Cây nhị phân là cây mà mỗi node không có quá 2
n Ví dụ về Binary Search Tree
node con.
n Cây tìm kiếm nhị phân là cây nhị phân mà:
47
n
n
Giá trị các nút thuộc cây con bên trái nhỏ hơn giá trị của
nút cha.
Giá trị các nút thuộc cây con bên phải lớn hơn giá trị của
nút cha.
Cây con trái
Cây con phải
25
77
n Duyệt cây nhị phân
11
43
65
68
93
n
n
n
Inorder traversal
Preorder traversal
Postorder traversal
7
17
31 44
45
46
4. Lập trình tổng quát
4.2.2. Java Collection Framework
n Collection là đối tượng có khả năng chứa
n
n
4.1. Giới thiệu
4.2. Java generic data structure
các đối tượng khác.
n Các thao tác thông thường trên collection
n
n
n
n
4.2.1. Data structure
n
Thêm/Xoá đối tượng vào/khỏi collection
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
n
Kiểm tra một đối tượng có ở trong collection
không
n
n
n
Lấy một đối tượng từ collection
Duyệt các đối tượng trong collection
Xoá toàn bộ collection
n
n
4.3. Định nghĩa và sử dụng Template
4.4. Ký tự đại diện (Wildcard)
47
48
12
9/18/17
4.2.2. Java Collection Framework (2)
4.2.2. Java Collection Framework (3)
n Các collection đầu tiên của Java:
n Một số lợi ích của Collections Framework
n
n
n
Mảng
Vector: Mảng động
Hastable: Bảng băm
n
n
n
n
Giảm thời gian lập trình
Tăng cường hiệu năng chương trình
Dễ mở rộng các collection mới
Khuyến khích việc sử dụng lại mã chương trình
n Collections Framework (từ Java 1.2)
n
Là một kiến trúc hợp nhất để biểu diễn và thao
tác trên các collection.
n
Giúp cho việc xử lý các collection độc lập với biểu
diễn chi tiết bên trong của chúng.
49
50
4. Lập trình tổng quát
4.2.2. Java Collection Framework (4)
n 4.1. Giới thiệu
n Collections Framework bao gồm
n
Interfaces: Là các giao tiếp thể hiện tính chất
của các kiểu collection khác nhau như List, Set,
Map.
Implementations: Là các lớp collection có sẵn
được cài đặt các collection interfaces.
Algorithms: Là các phương thức tĩnh để xử lý
trên collection, ví dụ: sắp xếp danh sách, tìm
phần tử lớn nhất...
n 4.2. Java generic data structure
n
n
n
4.2.1. Data structure
4.2.2. Java collection framework
4.2.3. Các interface trong Java collection
framework
n
n
n
4.2.4. Các cài đặt cho các interface – implementation
n 4.3. Định nghĩa và sử dụng Template
n 4.4. Ký tự đại diện (Wildcard)
51
52
13
9/18/17
4.2.3. Interfaces
a. Giao diện Collection
n List: Tập các đối tượng tuần tự, kế tiếp nhau, có thể lặp lại
n Set: Tập các đối tượng không lặp lại
n Xác định giao diện cơ bản cho các
thao tác với một tập các đối tượng
n
n
n
Thêm vào tập hợp
Xóa khỏi tập hợp
Kiểm tra có là thành viên
n Map: Tập các cặp khóa-giá trị (key-value) và không cho
phép khóa lặp lại
<<interface>>
Collection
<<interface>>
Map
n Chứa các phương thức thao tác
trên các phần tử riêng lẻ hoặc theo
khối
<<interface>>
<<interface>>
List
<<interface>>
SortedMap
n Cung cấp các phương thức cho
phép thực hiện duyệt qua các
phần tử trên tập hợp (lặp) và
chuyển tập hợp sang mảng
Set
<<interface>>
SortedSet
53
54
b. Giao diện List
c. Giao diện Set
n List kế thừa từ Collection, nó cung cấp thêm các
phương thức để xử lý collection kiểu danh sách (Danh
sách là một collection với các phần tử được xếp theo
chỉ số).
n
n
Set kế thừa từ Collection, hỗ trợ các thao tác xử lý trên
collection kiểu tập hợp (Một tập hợp yêu cầu các phần
tử phải không được trùng lặp).
Set không có thêm phương thức riêng ngoài các
phương thức kế thừa từ Collection.
n Một số phương thức của List
n
n
n
n
n
n
Object get(int index);
Object set(int index, Object o);
void add(int index, Object o);
Object remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
55
56
14
9/18/17
d. Giao diện SortedSet
n SortedSet kế thừa từ Set, nó hỗ trợ thao tác trên tập
hợp các phần tử có thể so sánh được. Các đối tượng
đưa vào trong một SortedSet phải cài đặt giao tiếp
Comparable hoặc lớp cài đặt SortedSet phải nhận một
Comparator trên kiểu của đối tượng đó.
Collection,
Set và List
n Một số phương thức của SortedSet:
n
n
n
Object first(); // lấy phần tử đầu tiên (nhỏ nhất)
Object last(); // lấy phần tử cuối cùng (lớn nhất)
SortedSet subSet(Object e1, Object e2); // lấy một tập các phần tử
nằm trong khoảng từ e1 tới e2.
57
58
e. Duyệt collection
e. Duyệt collection (2)
n Các phần tử trong collection có thể được duyệt thông
n
n
Iterator cho phép duyệt tuần tự một collection.
Các phương thức của Iterator:
qua Iterator.
n Các lớp cài đặt Collection cung cấp phương thức trả về
n
n
n
boolean hasNext();
Object next();
void remove();
iterator trên các phần tử của chúng.
n
Ví dụ:
Collection c;
Iterator it = c.iterator();
while ( it.hasNext() ) {
Point p = (Point) it.next();
System.out.println( p.toString() );
}
...
Iterator it = c.iterator();
59
60
15
9/18/17
f. Giao diện Iterator
f. Giao diện Iterator (2) - Ví dụ
Collection c;
n Cung cấp cơ chế thuận tiện để
duyệt (lặp) qua toàn bộ nội
dung của tập hợp, mỗi lần là
một đối tượng trong tập hợp
// Some code to build the
collection
n
Giống như SQL cursor
Iterator i = c.iterator();
while (i.hasNext()) {
Object o = i.next();
// Process this object
}
n ListIterator thêm các phương
thức đưa ra bản chất tuần tự
của danh sách cơ sở
n Iterator của các tập hợp đã sắp
xếp duyệt theo thứ tự tập hợp
62
g. Giao diện Map
g. Giao tiếp Map (2)
n
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ị
n
Map cung cấp 3 cách view dữ liệu:
n
n
n
View các khoá:
n
n
n
n
Thêm một cặp khóa-giá trị
Xóa một cặp khóa-giá trị
Lấy về giá trị với khóa đã có
Kiểm tra có phải là thành viên
(khóa hoặc giá trị)
Set keySet(); // Trả về các khoá
View các giá trị:
Collection values(); // Trả về các giá trị
View các cặp khoá-giá trị
Set entrySet(); // Trả về các cặp khoá-giá trị
n
Cung cấp 3 cách nhìn cho
nội dung của tập hợp:
n
n
n
Tập các khóa
Tập các giá trị
Tập các ánh xạ khóa-giá trị
n
Sau khi nhận được kết quả là một collection, ta có
thể dùng iterator để duyệt các phần tử của nó.
63
64
16
9/18/17
h. Giao diện SortedMap
4. Lập trình tổng quát
n Giao diện SortedMap kế thừa từ Map, nó cung cấp thao
n 4.1. Giới thiệu
n 4.2. Java generic data structure
tác trên các bảng ánh xạ với khoá có thể so sánh được.
n Giống như SortedSet, các đối tượng khoá đưa vào
trong SortedMap phải cài đặt giao tiếp Comparable
hoặc lớp cài đặt SortedMap phải nhận một Comparator
trên đối tượng khoá.
n
n
n
n
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
n 4.3. Định nghĩa và sử dụng Template
n 4.4. Ký tự đại diện (Wildcard)
65
66
4.2.4. Implementations
4.2.4. Implementations (2)
LinkedList
List
n Các cài đặt trong Collections Framework chính là các
ArrayList
lớp collection có sẵn trong Java. Chúng cài đặt các
collection interface ở trên để thể hiện các cấu trúc dữ
liệu cụ thể. Ví dụ: mảng động, danh sách liên kết, cây
đỏ đen, bảng băm...
HashSet
LinkedHashSet
Set
SortedSet
TreeSet
HashMap
LinkedHashMap
SortedMap
Map
TreeMap
67
68
17
9/18/17
4.2.4. Implementations (3) -Mô tả các cài
đặt
4.2.4. Implementations (3) -Mô tả các cài
đặt
n ArrayList: Mảng động, nếu các phần tử thêm vào vượt
quá kích cỡ mảng, mảng sẽ tự động tăng kích cỡ.
n LinkedList: Danh sách liên kết 2 chiều. Hỗ trợ thao tác
n
n
HashMap: Bảng băm (cài đặt của Map).
LinkedHashMap: Bảng băm kết hợp với linked list nhằm
đảm bảo thứ tự các phần tử (cài đặt của Map).
trên đầu và cuối danh sách.
n
TreeMap: Cây đỏ đen (cài đặt của Map).
n HashSet: Bảng băm.
n LinkedHashSet: Bảng băm kết hợp với linked list nhằm
đảm bảo thứ tự các phần tử.
n TreeSet: Cây đỏ đen (red-black tree).
69
70
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];
4.2.4. Implementations (3) – Tổng kết
Integer frequency =(Integer)map.get(key);
if (frequency == null) { frequency = ONE; }
else {
int value = frequency.intValue();
frequency = new Integer(value + 1);
}
map.put(key, frequency);
}
System.out.println(map);
Map sortedMap = new TreeMap(map);
System.out.println(sortedMap);
}
72
18
9/18/17
4. Lập trình tổng quát
4.3. Định nghĩa và sử dụng Template
n
n
4.1. Giới thiệu
4.2. Java generic data structure
class MyStack<T> {
n
n
n
n
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
public void push(T x) {...}
public T pop() {
...
}
n
n
4.3. Định nghĩa và sử dụng Template
4.4. Ký tự đại diện (Wildcard)
}
73
74
Nhắc lại ví dụ: Lập trình tổng quát trên
Java dùng upcasting và Object
Sử dụng template
public class Test {
class MyStack {
public static void main(String args[]) {
...
public void push(Object obj) {...}
public Object pop() {...}
}
MyStack<Integer> s1 = new MyStack<Integer>();
s1.push(new Integer(0));
Integer x = s1.pop();
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();
}
//s1.push(new Long(0));
à
Error
MyStack<Long> s2 = new MyStack<Long>();
s2.push(new Long(0));
Long y = s2.pop();
}
}
75
76
19
9/18/17
Định nghĩa Iterator
4. Lập trình tổng quát
public interface List<E>{
void add(E x);
n 4.1. Giới thiệu
n 4.2. Java generic data structure
Iterator<E> iterator();
}
n
n
n
n
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
public interface Iterator<E>{
E next();
boolean hasNext();
n 4.3. Định nghĩa và sử dụng Template
n 4.4. Ký tự đại diện (Wildcard)
}
class LinkedList<E> implements List<E> {
// implementation
}
77
78
4.4. Ký tự đại diện (Wildcard)
Ví dụ: Sử dụng Wildcards
public class Test {
public class Test {
void printList(List<?> lst) {
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<Object> lst1 = lst0; Error
//printList(lst0); Error
à
à
}
public static void main(String args[]) {
List<String> lst0 =
void static printList(List<Object> lst) {
Iterator it = lst.iterator();
while (it.hasNext())
System.out.println(it.next());
}
new LinkedList<String>();
List<Employee> lst1 =
new LinkedList<Employee>();
}
printList(lst0);
printList(lst1);
// String
// Employee
}
79
80
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 7: Đ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_7_da_hinh_polymophis.pdf

