Click to edit Master subtitle style CHƯƠNG 6:

ĐA HÌNH

Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học, TP.HCM

1

NỘI DUNG

• Khái niệm Đa hình

• Các bước xây dựng chương trình có tính đa

hình

• Từ khóa ‘base’

• Phương thức trừu tượng (abstract method)

2

• Từ khóa ‘new’ với phương thức

3 nguyên tắc lập trình hướng đối tượng

• Đóng gói (Encapsulation) và Giao diện

(Interface) – Ẩn chi tiết của lớp (Đóng gói), chỉ cung cấp

các phương thức cần thiết để dùng (Giao diện)

– Tạo lớp mới thừa kế lớp đã có

• Thừa kế (Inheritance)

– Khả năng tạo ra các lớp dẫn xuất, cài đặt cùng một method của lớp cơ sở theo những cách 3 khác nhau (tùy từng lớp dẫn xuất)

• Đa hình (Polymorphism)

Khái niệm đa hình

4

Khái niệm Đa hình

– poly = many – morphism = forms

• Đa hình (polymorphism)

Đa hình là hiện tượng các đối tượng thuộc các

lớp khác nhau có khả năng hiểu cùng một

thông điệp theo các cách khác nhau hoặc

nhiều kiểu tồn tại của một đối tượng

5

Khái niệm Đa hình

LandRover dùng 2.0 L engine để move

LandRove r object

Ford dùng V engine để move

Move

Ford object

Honda object

Honda dùng i-vtec để move

6

Khái niệm Đa hình

• Đa hình phương thức: Cùng một phương

thức có thể được thực hiện khác nhau trên các

loại đối tượng khác nhau

 Cùng nguyên mẫu phương thức cho

các lớp khác nhau: overriding phương thức

• Đa hình đối tượng: nhìn nhận đối tượng theo

nhiều kiểu khác nhau

7

Khái niệm Đa hình

Phân biệt Overloading vs Overriding?

• Overloading (nạp chồng) phương thức: giữ

tên và giá trị trả về, chỉ thay đổi đối số

• Overriding (ghi đè) phương

thức: giữ

nguyên tên, giá trị trả về và đối số (không

thay đổi nguyên mẫu phương thức)

8

Khái niệm Đa hình

• Đa hình phương thức

– Các lớp dẫn xuất cài đặt cùng một phương thức của lớp cơ sở, nhưng mỗi lớp dẫn xuất có cách cài đặt khác nhau

9

Khái niệm Đa hình

– Tạo lớp mới dựa trên lớp đã có (lớp cơ sở),

• Nhờ đặc tính của thừa kế giúp:

thừa hưởng những gì lớp cơ sở có

– Thêm một số Field và Method mới vào lớp mới

– Cài đặt lại phương thức đã được lớp cơ sở

cung cấp

10

Các bước xây dựng tính đa hình

11

Các bước xây dựng tính đa hình

12

Các bước xây dựng tính đa hình

public class Car { public virtual void Move() { Console.WriteLine("Car: Move"); } }

13

• Lớp cơ sở: Lớp Car

Các bước xây dựng tính đa hình

– Cho phép lớp dẫn xuất có quyền thay đổi cách

phương thức này làm việc (cài đặt lại)

– Từ khóa này có thể dùng cho

• Method • Properties Indexers

• events

14

• Từ khóa ‘virtual’

Các bước xây dựng tính đa hình

15

• Lớp dẫn xuất: có thể cung cấp một cách cài đặt khác của phương thức ở lớp cơ sở

Các bước xây dựng tính đa hình

public class LandRover : Car { public override void Move() { Console.WriteLine(“Move: LandRover (2.0 L engine)"); } }

– Tạo một hàm giống như lớp cơ sở (copy) – Thêm từ khóa override trước phương thức

16

• Để cài đặt lại phương thức

Các bước xây dựng tính đa hình

• Nếu trong lớp cơ sở không có từ khóa virtual trước phương thức chúng ta muốn override, thì chúng ta không thể override phương thức đó

• virtual: “tôi cho phép bạn làm gì khác với

phương thức này”

• override: “bạn cho phép tôi, tôi sẽ làm một

số điều khác biệt với nó”

17

Các bước xây dựng tính đa hình

– Chúng ta không phải bắt buộc phải override

các phương thức lớp cơ sở

– Nếu không override thì sao?

18

• Chú ý:

Các bước xây dựng tính đa hình

public class Ford : Car { public override void Move() { Console.WriteLine(“Move: Ford (V engine)"); } }

public class Honda : Car { public override void Move() { Console.WriteLine(“Move: Honda (i- vtec)"); } }

19

Các bước xây dựng tính đa hình

• Lớp LandRover, Ford, Honda thừa kế từ lớp Car nên có thể dùng như lớp Car

Car car1 = new Car(); Car car2 = new LandRover(); Car car3 = new Ford(); Car car4 = new Honda();

20

Các bước xây dựng tính đa hình

• Chúng ta có thể gọi phương thức Move().

Tùy theo kiểu thực sự mà các cài đặt khác nhau sẽ được gọi car1.Move(); car2.Move(); car3.Move(); car4.Move();

Move: Car Move: LandRover (2.0 L engine) Move: Ford (V engine) Move: Honda (i-vtec)

Press any key to continue . . . • Gọi cùng phương thức (cùng signature) các phương thức khác nhau được chạy

21

Xem lại từ khóa ‘base’

– Truy cập các constructor của lớp cơ sở (đã học) – Truy cập các thành viên không private từ lớp

• Từ khóa ‘base’:

cơ sở

• Thông thường ta không cần dùng ‘base’ để

truy cập thành viên lớp cơ sở

22

Xem lại từ khóa ‘base’

public override void Move() { base.Move(); Console.WriteLine("Move: LandRover (2.0 L engine)"); }

23

• Khi override phương thức, chúng ta có thể dùng base để truy cập phiên bản gốc của method này

this và base

– Gọi constructor khác của lớp hiện tại – Giải quyết name hiding (truy cập field của lớp)

• Từ khóa ‘this’

– Gọi constructor của lớp cơ sở – Gọi method của lớp cơ sở (khi viết hàm

override)

24

• Từ khóa ‘base’

Phương thức trừu tượng (abstract method)

25

Trừu tượng là gì?

• Loại bỏ những thông tin cụ thể, giữ lại các

thông tin chung

• Mức độ trừu tượng hoá được thể hiện trên

cây kế thừa

26

Vấn đề trừu tượng

• Mức độ trừu tượng càng cao  thông tin chung và phương thức chung càng tổng quát Có thể tồn tại những phương thức không thể xác định thực hiện như thế nào

• Ví dụ:

Lớp Hình chữ nhật, Hình tam giác, Hình tròn có thể trừu tượng thành Lớp Hình học nói chung  Muốn tính diện tích cho một Hình học? 27

Abstract method

(dummy implementation)

– Không cài đặt phương thức (dùng từ khóa

• Khi một phương thức trong lớp cơ sở không làm gì cả, viết hàm này như thế nào? – Cung cấp cài đặt giả cho phương thức

abstract) • Thêm từ khóa abstract trước lớp abstract public class Car • Thêm từ khóa abstract trước phương thức không { cài đặt public abstract void Move(); }

28

Abstract method

• Lớp có chứa phương thức abstract thì bắt buộc

phải khai báo lớp đó là lớp abstract

• Khi lớp là abstract, thì không thể tạo đối tượng (chúng ta cần tạo đối tượng của các lớp dẫn xuất không trừu tượng)

Car car1 = new Car(); // error Car car2 = new LandRover(); Car car3 = new Ford(); Car car4 = new Honda();

29

Abstract method

• Lớp trừu tượng có thể có các virtual method, method thông thường khác

• Trong lớp dẫn xuất, để cài đặt abstract method, chúng ta vẫn dùng từ khóa ‘override’

– override cho virtual method – override cho abstract method

30

• override:

Bài tập ví dụ

• Lớp HinhTron (hình tròn) gồm các thông

tin: – Bán kính

• Lớp HinhChuNhat(hình chữ nhật) gồm các

thông tin: – Chiều ngang – Chiều đứng

31

• Hãy sử dụng kỹ thuật kế thừa và đa hình để viết chương trình cho phép nhập thông tin của đối tượng hình tròn và hình chữ nhật. Sau đó tính và in thông tin diện tích của mỗi hình

Bài tập ví dụ …

Xác định lớp và thông tin của lớp • Lớp HinhTron

– Thuộc tính: r (bán kính), s (diện tích) – Phương thức: Nhap (nhập thông tin),

TinhDienTich (tính diện tích)

– Thuộc tính: m (chiều ngang), n (chieu dung), s

(diện tích)

– Phương thức: Nhap (nhập thông tin),

TinhDienTich (tính diện tích)

32

• Lớp HinhChuNhat

Bài tập ví dụ …

Áp dụng kỹ thuật kế thừa  Xác định các điểm chung của các lớp • Lớp HinhTron

– Thuộc tính: r (bán kính), s (diện tích) – Phương thức: Nhap (nhập thông tin),

TinhDienTich (tính diện tích)

– Thuộc tính: m (chiều ngang), n (chieu dung), s

(diện tích)

– Phương thức: Nhap (nhập thông tin),

TinhDienTich (tính diện tích)

33

• Lớp HinhChuNhat

Bài tập ví dụ …

Tạo lớp mới từ những điểm chung này • Lớp HinhHoc

– Thuộc tính: s (diện tích) – Phương thức: Nhap (nhập thông tin),

TinhDienTich (tính diện tích)

Trong đó: các phương thức không làm gì cả  abstract method  abstract class HinhHoc

34

Bài tập ví dụ …

35

• Sơ đồ lớp

Lớp HinhHoc

public abstract class HinhHoc {

protected double s;

//Định nghĩa các constructor //và property get, set tại đây ...

public abstract void Nhap(); public abstract void TinhDienTich();

}

36

Lớp HinhTron

public class HinhTron: HinhHoc {

private double r; //Định nghĩa các constructor //và property get, set tại đây ... public override void Nhap()

{

//Định nghĩa phương thức ...

}

public override void TinhDienTich()

{

//Định nghĩa phương thức ...

}

}

37

Lớp HinhChuNhat

public class HinhChuNhat:HinhHoc {

private double m; private double n; //Định nghĩa constructor //và property get, set tại đây ... public override void Nhap()

{

//Định nghĩa phương thức ...

}

public override void TinhDienTich()

{

//Định nghĩa phương thức ...

}

}

38

Cú pháp phương thức chung

Có 3 trường hợp cùng chung phương thức giữa lớp cơ sở và lớp dẫn xuất trong kế thừa: • TH1: Chung hoàn toàn cách thức cài đặt

Chỉ cài đặt phương thức này ở lớp cơ sở

• TH2: Chung một phần cách thức cài đặt

Lớp cơ sở (virtual) – Lớp dẫn xuất (override) • TH3: Chỉ chung nguyên mẫu phương thức nhưng

khác cách thức cài đặt

Lớp cơ sở (abstract) – Lớp dẫn xuất (override) !!! Trường hợp này lớp cơ sở chuyển sang lớp abstract

39

Bài tập

Thiết kế chương trình quản lý danh sách các hình học, gồm các loại hình sau: • Hình chữ nhật: chiều ngang và chiều đứng • Hình tròn: bán kính • Hình tam giác: chiều dài 3 cạnh a, b và c Chức năng: cho phép nhập, xuất danh sách các hình trong một mảng một chiều. Cho biết số lượng và hình có diện tích lớn nhất của từng loại

40

Từ khóa new với phương thức

41

Từ khóa ‘new’ với phương thức

• Chúng ta có thể đặt từ khóa ‘new’ trước

phương thức

public class LandRover : Car { public new void Move() { Console.WriteLine(“Move: LandRover (2.0 L engine)"); } }

42

• Ý nghĩa: “Tôi là phương thức mới trong lớp dẫn xuất, hoàn toàn không có liên quan gì đến phương thức cùng tên trong lớp cơ sở”

Từ khóa ‘new’ với phương thức

– Khi dùng ‘new’ với phương thức thì không

thực hiện được tính đa hình

– Chúng ta hiếm khi dùng từ khóa ‘new’ trong

trường hợp này

– Nếu muốn cài đặt một phương thức hoàn toàn mới không liên quan thì nên dùng tên khác

43

• Chú ý:

ĐIỂM CHÍNH

• Đa hình nghĩa là chúng ta có thể tạo các lớp dẫn xuất cài đặt cùng một phương thức như trong lớp cơ sở nhưng theo những cách khác nhau

• Phương thức trong lớp cơ sở được đánh dấu virtual cho phép lớp dẫn xuất dùng từ khóa override để cung cấp một cài đặt khác

44

• Các bước xây dựng tính đa hình

ĐIỂM CHÍNH

– Không thể dùng để tạo đối tượng – Phương thức đánh dấu abstract

• Không có cài đặt • Lớp dẫn xuất phải cài đặt

• Lớp được đánh dấu abstract

• Từ khóa ‘new’ đứng trước phương thức để

báo – Đây là phương thức mới – Phương thức này không liên quan đến phương

thức cùng tên trong lớp cơ sở

45