PHƢƠNG PHÁP LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG

KẾ THỪA

(INHERITANCE)

Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn

Nội dung trình bày

 Phạm vi sử dụng

 Giới thiệu kế thừa

 Lớp Object

 Cài đặt lại phƣơng thức

2

Giới thiệu kế thừa

 Tính chất kế thừa trong lập trình hƣớng đối tƣợng cho phép xây dựng một lớp đối tƣợng mới bằng cách mở rộng lớp đối tƣợng có sẵn.

 Lớp đối tƣợng có sẵn đƣợc gọi là lớp cơ sở (base

class)

 Lớp đối tƣợng mới đƣợc gọi là lớp dẫn xuất (derived

class)

3

Kế thừa

4

Kế thừa

 Lớp sinh viên đƣợc gọi là lớp cơ sở trực tiếp của lớp chính quy, lớp cao đẳng, lớp tại chức và lớp hoàn chỉnh.

 Các lớp dẫn xuất chính quy, cao đẳng, tại chức, hoàn chỉnh đƣợc gọi là các lớp dẫn xuất kế thừa trực tiếp từ lớp sinh viên.

5

Kế thừa

– Các thuộc tính và các phƣơng thức kế thừa đƣợc từ

 Lớp dẫn xuất bao gồm các thành phần sau

lớp cơ sở

thêm.

– Các thuộc tính và các phƣơng thức đƣợc định nghĩa

6

Kế thừa

 Lớp dẫn xuất đƣợc gọi là mở rộng lớp cơ sở bởi vì lớp dẫn xuất vừa chứa các thành phần kế thừa đƣợc từ lớp cơ sở vừa chứa các thành phần riêng của nó.

 Lƣu ý là lớp dẫn xuất không thể xóa bất cứ thuộc tính

hay phƣơng thức nào kế thừa đƣợc từ lớp cơ sở.

7

Khai báo kế thừa trong C#

nhiều lớp đối tƣợng có sẵn.

 Trong C++ một lớp đối tƣợng đƣợc phép kế thừa từ

 Trong C# và Java, một lớp đối tƣợng đƣợc phép kế

thừa một lớp đối tƣợng có sẵn.

8

Kế thừa trong C#

 Lớp B đƣợc gọi là lớp dẫn xuất kế thừa trực tiếp từ

 Lớp A đƣợc gọi là lớp cơ sở trực tiếp của lớp B

lớp A

 Lớp B kế thừa đƣợc các thuộc tính và các phƣơng

 Sử dụng dấu : để khai báo lớp B kế thừa lớp A

thức đƣợc định nghĩa trong lớp A

thức riêng của mình

 Lớp B đƣợc phép thêm các thuộc tính và các phƣơng

 Lớp B không đƣợc phép xóa các thuộc tính hay các

phƣơng thức kế thừa đƣợc từ lớp A.

9

Ký hiệu kế thừa

10

Phạm vi sử dụng

báo với 3 phạm vi sử dụng cơ bản đó là

 Các thuộc tính và các phƣơng thức có thể đƣợc khai

– Private

– Public

– Protected

11

Phạm vi sử dụng

 Thuộc tính hay phương thức đƣợc khai báo với phạm vi là private thì thuộc tính hay phƣơng thức đó chỉ được sử dụng trực tiếp bên trong lớp đó.

 Thuộc tính hay phương thức đƣợc khai báo với phạm vi là public thì thuộc tính hay phƣơng thức đó có thể được sử dụng trực tiếp bên trong lớp, bên trong các lớp dẫn xuất và bên các lớp khác.

 Thuộc tính hay phương thức đƣợc khai báo với phạm vi là protected thì thuộc tính hay phƣơng thức đó có thể được sử dụng trực tiếp bên trong lớp lẫn bên trong các lớp dẫn xuất.

12

Phạm vi sử dụng

13

Phạm vi sử dụng private

 Các thuộc tính hay phƣơng thức đƣợc khai báo với phạm vi sử dụng là private trong lớp cơ sở sẽ đƣợc kế thừa trong các lớp dẫn xuất

 Nhƣng không đƣợc phép sử dụng trực tiếp các thuộc

tính hay các phƣơng thức này.

 Các lớp dẫn xuất cũng không thể xóa các thuộc tính hay các phƣơng thức đƣợc kế thừa trong lớp cơ sở.

14

Phạm vi sử dụng private

các phƣơng thức là private của lớp cơ sở

 Các lớp dẫn xuất kế thừa đƣợc các thuộc tính hay

 Nhƣng không đƣợc phép sử dụng trực tiếp mà phải sử dụng gián tiếp thông qua các phƣơng thức protected hay public của lớp cơ sở mà có sử dụng các thuộc tính hay phƣơng thức này.

 Ví dụ nhƣ sử dụng các phƣơng thức cung cấp, cập nhật thông tin và các property hay phƣơng thức nhập, xuất… (có phạm vi sử dụng protected hay public)

15

Phạm vi sử dụng protected

 Các lớp dẫn xuất không thể xóa các thuộc tính hay

 Các thuộc tính hay phƣơng thức đƣợc khai báo với phạm vi sử dụng là protected trong lớp cơ sở sẽ đƣợc kế thừa trong các lớp dẫn xuất, đƣợc truy xuất trực tiếp và trở thành các thuộc tính hay phƣơng thức protected của các lớp dẫn xuất.

các phƣơng thức đƣợc kế thừa trong lớp cơ sở.

16

Phạm vi sử dụng public

 Các lớp dẫn xuất không thể xóa các thuộc tính hay

 Các thuộc tính hay phƣơng thức đƣợc khai báo với phạm vi sử dụng là public trong lớp cơ sở sẽ đƣợc kế thừa trong các lớp dẫn xuất, đƣợc truy xuất trực tiếp và trở thành các thuộc tính hay phƣơng thức public của các lớp dẫn xuất.

các phƣơng thức đƣợc kế thừa trong lớp cơ sở.

17

Phạm vi sử dụng

Phạm vi sử dụng ở lớp cơ sở private

protected

public

Phạm vi sử dụng ở lớp dẫn xuất Kế thừa được, không truy xuất trực tiếp, sử dụng gián tiếp thông qua các phương thức protected hay public của lớp cơ sở Kế thừa được, protected, truy xuất trực tiếp Kế thừa được, public, truy xuất trực tiếp

18

Phạm vi sử dụng private

19

Phạm vi sử dụng private

20

Phạm vi sử dụng private

21

Phạm vi sử dụng private

– Thuộc tính là n (có phạm vi sử dụng private)

 Lớp cơ sở A có:

– Phƣơng thức GetN, SetN (có phạm vi sử dụng

public)

22

Phạm vi sử dụng private

– Các thuộc tính kế thừa đƣợc từ A: n (không nhìn

 Lớp dẫn xuất B kế thừa từ A có:

thấy và không sử dụng trực tiếp đƣợc)

private)

– Các thuộc tính riêng của B : m (có phạm vi sử dụng

– Các phƣơng thức kế thừa đƣợc từ A: GetN, SetN

(có phạm vi sử dụng public)

– Các phƣơng thức riêng của B: GetM, SetM, Xuat

(có phạm vi sử dụng public)

23

Phạm vi sử dụng private

 Lớp B kế thừa đƣợc thuộc tính n của lớp cơ sở A nhƣng không thể sử dụng trực tiếp(nhìn thấy trực tiếp) mà sử dụng gián tiếp thuộc tính n thông qua phƣơng thức GetN và SetN kế thừa từ lớp cơ sở A.

 Tƣơng tự cho việc sử dụng phƣơng thức là private kế

thừa đƣợc từ lớp cơ sở

24

Phạm vi sử dụng protected

25

Phạm vi sử dụng protected

26

Phạm vi sử dụng protected

27

Phạm vi sử dụng protected

– Thuộc tính là n (có phạm vi sử dụng protected)

 Lớp cơ sở A có:

– Phƣơng thức GetN, SetN (có phạm vi sử dụng

public)

28

Phạm vi sử dụng protected

– Các thuộc tính kế thừa đƣợc từ A: n (nhìn thấy và

 Lớp dẫn xuất B kế thừa từ A có:

có thể sử dụng trực tiếp đƣợc)

private)

– Các thuộc tính riêng của B : m (có phạm vi sử dụng

– Các phƣơng thức kế thừa đƣợc từ A: GetN, SetN

(có phạm vi sử dụng public)

– Các phƣơng thức riêng của B: GetM, SetM, Xuat (có

phạm vi sử dụng public)

29

Phạm vi sử dụng protected

 Tƣơng tự cho việc sử dụng phƣơng thức là protected

 Lớp B kế thừa đƣợc thuộc tính n của lớp cơ sở A, trong B có thể sử dụng trực tiếp(nhìn thấy trực tiếp) thuộc tính n. Mặt khác trong B có thể sử dụng gián tiếp thuộc tính n thông qua phƣơng thức GetN và SetN kế thừa từ lớp cơ sở A.

kế thừa đƣợc từ lớp cơ sở

30

Phạm vi sử dụng public

31

Phạm vi sử dụng public

32

Phạm vi sử dụng public

33

Phạm vi sử dụng public

34

Phạm vi sử dụng public

– Thuộc tính là n (có phạm vi sử dụng public)

 Lớp cơ sở A có:

– Phƣơng thức GetN, SetN (có phạm vi sử dụng

public)

35

Phạm vi sử dụng public

– Các thuộc tính kế thừa đƣợc từ A: n (nhìn thấy và

 Lớp dẫn xuất B kế thừa từ A có:

có thể sử dụng trực tiếp đƣợc)

private)

– Các thuộc tính riêng của B : m (có phạm vi sử dụng

– Các phƣơng thức kế thừa đƣợc từ A: GetN, SetN

(có phạm vi sử dụng public)

– Các phƣơng thức riêng của B: GetM, SetM, Xuat

(có phạm vi sử dụng public)

36

Phạm vi sử dụng public

 Tƣơng tự cho việc sử dụng phƣơng thức là public kế

 Lớp B kế thừa đƣợc thuộc tính n của lớp cơ sở A, trong B có thể sử dụng trực tiếp(nhìn thấy trực tiếp) thuộc tính n. Mặt khác trong B có thể sử dụng gián tiếp thuộc tính n thông qua phƣơng thức GetN và SetN kế thừa từ lớp cơ sở A.

thừa đƣợc từ lớp cơ sở

37

Lớp Object

này có:

 Lớp Object là lớp đã đƣợc định nghĩa sẵn, trong lớp

– Phƣơng thức khởi tạo đối tƣợng mặc định

– Các phƣơng

thức mức đối

tƣợng Equals,

– Phƣơng thức hủy đối tƣợng

GetHashCode, GetType, ToString()

– Phƣơng thức mức lớp Equals

38

Lớp Object

39

Lớp Object

40

Lớp Object

các lớp đối tƣợng.

 Trong C# lớp Object là lớp cơ sở nhất của của tất cả

 Các lớp đối tƣợng không khai báo kế thừa từ bất cứ lớp nào thì lớp Object chính là lớp cơ sở ngầm định của các lớp đó.

 Trong C# không hỗ trợ đa thừa kế, mỗi lớp có tối đa một lớp cơ sở. Vì vậy khi ta khai báo một lớp kế thừa từ một lớp khác ngoài Object thì lớp Object không còn là lớp cơ sở ngầm định của lớp đó nữa.

41

Lớp Object

42

Lớp Object

 Lớp phân số thừa hƣởng đƣợc các phƣơng thức từ

 Lớp phân số kế thừa từ lớp Object

lớp Object

ReferenceEquals

– Các phƣơng thức mức lớp: Equals,

– Các phƣơng tƣợng: Equals,

thức mức đối GetHashCode, ToString, GetType

43

Lớp Object

44

Lớp Object

45

Lớp Object

46

Cài đặt lại phƣơng thức

của lớp cơ sở trong lớp dẫn xuất

 Đôi khi chúng ta cần định nghĩa lại các phƣơng thức

 Việc này đƣợc thực hiện bằng cách khai báo và cài

Phƣơng thức đƣợc định nghĩa lại còn đƣợc gọi là

đặt lại các phƣơng thức này trong lớp dẫn xuất.

phƣơng thức nạp chồng (overriden method).

trùng tên khác (nếu có) trong lớp cơ sở.

Lưu ý: hàm đƣợc định nghĩa lại này sẽ che đi các hàm

47

Kế thừa

48

Kế thừa

– Static

 Không đƣợc khai báo phƣơng thức virtual với:

– Private

49