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