Kế thừa trong C# Lớp A được gọi là lớp cơ sở trực tiếp của lớp B Lớp B được gọi là lớp dẫn xuất kế thừa trực tiếp từ lớp A Sử dụng dấu : để khai báo lớp B kế thừa lớp A Lớp B kế
Trang 1PHƯƠNG PHÁP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn
KẾ THỪA (INHERITANCE)
Trang 2Nội dung trình bày
Giới thiệu kế thừa
Phạm vi sử dụng
Lớp Object
Cài đặt lại phương thức
Trang 3Giớ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)
Trang 4Kế thừa
Trang 5Kế 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
Trang 6Kế thừa
Lớp dẫn xuất bao gồm các thành phần sau
– Các thuộc tính và các phương thức kế thừa được từ lớp cơ sở
– Các thuộc tính và các phương thức được định nghĩa thêm
Trang 7Kế 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ở
Trang 8Khai báo kế thừa trong C#
Trong C++ một lớp đối tƣợng đƣợc phép kế thừa từ nhiều lớp đối tƣợng có sẵn
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
public class A {
} public class B : A {
}
Trang 9Kế thừa trong C#
Lớp A được gọi là lớp cơ sở trực tiếp của lớp B
Lớp B được gọi là lớp dẫn xuất kế thừa trực tiếp từ lớp A
Sử dụng dấu : để khai báo lớp B kế thừa lớp A
Lớp B kế thừa được các thuộc tính và các phương thức được định nghĩa trong lớp A
Lớp B được phép thêm các thuộc tính và các phương thức riêng của mình
Lớp B không được phép xóa các thuộc tính hay các
Trang 10Ký hiệu kế thừa
Trang 12Phạ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
Trang 13Phạm vi sử dụng
STT Tên phạm vi Phạm vi sử dụng
1 private Được sử dụng trực tiếp bên trong lớp
2 public Được sử dụng trực tiếp bên trong lớp và các lớp khác
3 protected Được sử dụng trực tiếp bên trong lớp và trong các lớp dẫn xuất
Trang 14Phạ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ở
Trang 15Phạm vi sử dụng private
Các lớp dẫn xuất kế thừa được các thuộc tính hay các phương thức là private của lớp cơ sở
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)
Trang 16 Các lớp dẫn xuất 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ở
Trang 17Phạm vi sử dụng public
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 lớp dẫn xuất 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ở
Trang 18Phạm vi sử dụng
Phạm vi sử dụng ở lớp cơ sở Phạm vi sử dụng ở lớp dẫn xuất
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ở
tiếp
Trang 19return this n;
} }
Trang 20public void SetM(int m) {
this.m = m;
} public int GetM() {
return this.m;
} public void Xuat() {
Console WriteLine( "n={0}, m={1}" , this.GetN(), this.m);
} }
Trang 24Phạ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ở
Trang 25public void SetN( int n) {
this n=n;
} public int GetN() {
return this n;
} }
Trang 26public void SetM(int m) {
this.m = m;
} public int GetM() {
return this.m;
} public void Xuat() {
Console WriteLine( "n={0}, m={1}" , this.n, this.m);
} }
Trang 29Phạm vi sử dụng protected
Lớp dẫn xuất B kế thừa từ A có:
– Các thuộc tính kế thừa được từ A: n (nhìn thấy và
có thể sử dụng trực tiếp được) – Các thuộc tính riêng của B : m (có phạm vi sử dụng private)
– 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)
Trang 30Phạm vi sử dụng 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
Tương tự cho việc sử dụng phương thức là protected
kế thừa được từ lớp cơ sở
Trang 31public void SetN( int n) {
this n=n;
} public int GetN() {
return this n;
} }
Trang 32public void SetN( int n) {
this n=n;
} public int GetN() {
return this n;
} }
Trang 33public void SetM(int m) {
this.m = m;
} public int GetM() {
return this.m;
} public void Xuat() {
Console WriteLine( "n={0}, m={1}" , this.n, this.m);
} }
Trang 36Phạm vi sử dụng public
Lớp dẫn xuất B kế thừa từ A có:
– Các thuộc tính kế thừa được từ A: n (nhìn thấy và
có thể sử dụng trực tiếp được) – Các thuộc tính riêng của B : m (có phạm vi sử dụng private)
– 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)
Trang 37Phạm vi sử dụng public
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
Tương tự cho việc sử dụng phương thức là public kế thừa được từ lớp cơ sở
Trang 38Lớp Object
Lớp Object là lớp đã được định nghĩa sẵn, trong lớp này có:
– Phương thức khởi tạo đối tượng mặc định
– Phương thức hủy đối tượng
– Các phương thức mức đối tượng Equals, GetHashCode, GetType, ToString()
– Phương thức mức lớp Equals
Trang 39Lớp Object
Trang 40Lớp Object
Trang 41 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
Trang 43Lớp Object
Lớp phân số kế thừa từ lớp Object
Lớp phân số thừa hưởng được các phương thức từ lớp Object
– Các phương thức mức lớp: Equals, ReferenceEquals
– Các phương thức mức đối tượng: Equals, GetHashCode, ToString, GetType
Trang 44}
Lớp SinhVienCaoDang public class SinhVienCaoDang : SinhVien
{
}
Trang 45}
Trang 47Cài đặt lại phương thức
Đôi khi chúng ta cần định nghĩa lại các phương thức của lớp cơ sở trong lớp dẫn xuất
Việc này được thực hiện bằng cách khai báo và cài đặt lại các phương thức này trong lớp dẫn xuất
Phương thức được định nghĩa lại còn được gọi là phương thức nạp chồng (overriden method)
trùng tên khác (nếu có) trong lớp cơ sở
Trang 48Kế thừa