Chương 6 Kế thừa lớp đối tượng
1. Tổng quát hoá & chuyên biệt hoá 2. Sự kế thừa 3. Quá tải hàm trong kế thừa 4. Các loại kế thừa 5. Hàm dựng và huỷ trong kế thừa
Bạn đang xem trước 20 trang tài liệu Chương 6 Kế thừa lớp đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Kế Thừa Lớp Đối Tượng
Môn Lập Trình Hướng Đối Tượng – Chương 6
Nguyễn Minh Thành
[M] : Thanhnm@itc.edu.vn
1
Nội Dung
1. Tổng quát hoá & chuyên biệt hoá
2. Sự kế thừa
3. Quá tải hàm trong kế thừa
4. Các loại kế thừa
5. Hàm dựng và huỷ trong kế thừa
2
1. Tổng quát hoá & chuyên biệt hoá
• Các lớp đối tượng trong thực tế không tồn tại độc
lập mà có mối quan hệ với nhau.
• Tổng quát hoá và chuyên biệt hoá là mối hai quan
hệ đặc biệt, là mối quan hệ phân cấp và hỗ trợ lẫn
nhau.
▫ Ví dụ : Động vật là một lớp đối tượng. Loài mèo là một
lớp đối tượng khác và cũng là động vật.
Loài Mèo, khỉ… là chuyên biệt hoá của động vật
Động vật là tổng quát hoá của mèo, khỉ…
3
Ký hiệu
• A: Là trường hợp tổng quát của B
• B: Là trường hợp chuyên biệt của A
4
A
B
A
B C
A: Là trường hợp tổng quát của B và C
B, C: Là trường hợp đặc biệt của A
1. Tổng quát hoá & chuyên biệt hoá
• Trong lập trình HĐT, cần thể hiện được 2 mối quan
hệ này nhằm:
▫ Tái sử dụng lại chương trình
▫ Mở rộng được chương trình
▫ Đảm bảo tính uyển chuyển của chương trình
Tính kề thừa
5
Vi dụ 1
Xây dựng lớp ngày trong ứng dụng tính tiền lãi của một ngân
hàng thành lập ngày 14/3/1997
Giả sử đã xây dựng lớp CNGAY
•Cách 1: Sửa lại lớp CNGAY cho phù hợp với các yêu cầu của lớp
CNGAYNH trong ứng dụng trên Sửa lại hàm kiểm tra
Ảnh hưởng đến các chương trình khác có sử dụng lớp CNGAY
ở dạng tổng quát.
•Cách 2: Xây dựng lớp CNGAYNH độc lập với lớp CNGAY
Tốn nhiều công sức.
•Cách 3: Sao chép lớp CNGAY để tạo lớp CNGAYNH và sau đó sửa
lại lớp CNGAYNH theo yêu cầu của chương trình
Khó khăn do thực hiện thủ công khi mở rộng, cập nhật, ...
Cần có cơ chế cho phép khai báo lớp CNGAYNH là lớp CNGAY
với 1 số các sửa đổi bổ sung.
6
Ví dụ 1 (tt)
7
CNGAY
CNGAYNH
Ví dụ 2
Chương trình đánh cờ tướng trên máy tính
Tương tự, mỗi quân cờ được xem như 1 điểm (phải dựa
vào lớp DIEM) nhưng mỗi quân cờ có những đặc điểm khác nhau
do vậy trên nền tảng lớp DIEM ta cần bổ sung và sửa đổi một số
phần chứ không phải tốn công sức để xây dựng lại từ đầu.
8
CDIEM
CQUANCO
CXE CCHOT CPHAO CMA CTUONG CSI CVOI
Ví dụ 3
Ví dụ 3: Chương trình quản lý giáo vụ trường phổ thông (Giáo
viên, học sinh, phụ huynh, công nhân viên, ...)
9
CNGUOI
CHOCSINH CGIAOVIEN CVANPHONG CPHUHUYNH
2. Khái niệm
Kế thừa là 1 cơ chế trong ngôn ngữ lập trình hướng
đối tượng cho phép thể hiện quan hệ đặc biệt hoá
trong sơ đồ lớp bằng cách cho phép khai báo 1 lớp B
là 1 lớp dẫn xuất từ lớp A (B là trường hợp đặc biệt
của A) khi đó B sẽ có tất cả các thuộc tính và đặc
điểm của A ngoài ra B có thể có thêm những thuộc
tính mới, những hàm kiểm tra ràng buộc mới, những
hoạt động khởi tạo, cập nhật, cung cấp thông tin và
xử lý mới.
10
Khái niệm(tt)
Một trong những tính chất quan trọng mong muốn
trong phương pháp lập trình hướng đối tượng là khả
năng tái sử dụng các lớp đã được định nghĩa.
Do đó, với kế thừa, người lập trình có thể định nghĩa
lớp đối tượng mới dựa trên 1 hay nhiều lớp đối tượng
đã có sẵn.
Lớp có sẵn được gọi là lớp cơ sở (based class) và lớp
kế thừa được gọi là lớp dẫn xuất (derived class)
11
Khái niệm (tt)
12
A B
* tính chất chung
- tính chất của A
+ tính chất của B
- - *- - - *-
*- - * - - *
+ * + + + * + *
+ * + + + * +
C
A B
- - - - - - - -
- -
+ + + + + + +
+ + +
* * * *
*
Khai báo
class TênLớpCha
{
Thuộc tính và phương thức của lớp cha
};
class TênLớpDẫnXuất : TênLớpCha
{
Thuộc tính và phương thức bổ sung của lớp dẫn
xuất
};
13
Quá Tải Hàm trong kế thừa
Có 2 cách để định nghĩa hành động bổ sung cho phương thức đã có sẵn ở
lớp cha trong lớp dẫn xuất (phương thức lớp dẫn xuất trùng tên với
phương thức lớp cha)
Dùng từ khóa new
class COSO
{
protected kiểu data1;
protected kiểu data2;
public void Method1()
{}
public void Method2()
{}
}
14
class DANXUAT : COSO
{
private kiểu data3;
public new void Method1()
{}
public void Method4()
{}
}
Quá Tải Hàm trong kế thừa (tt)
Dùng virtual & override
class COSO
{
protected kiểu data1;
protected kiểu data2;
public virtual void Method1()
{}
public virtual void Method2()
{}
}
class DANXUAT : COSO
{
private kiểu data3;
public override void Method1()
{}
public void Method4()
{}
}
15
Ví dụ
• Viết chương trình nhập xuất nhân viên, biết rằng gồm 2 loại
nhân viên: Nhân viên biên chế và nhân viên hợp đồng. Thông
tin của nhân viên gồm: Mã số, Họ tên.
▫ Nhân viên biên chế có thông tin riêng là bậc lương.
▫ Nhân viên hợp đồng có thông tin riêng là số giờ làm.
Ta có cây kế thừa sau:
16
CNHANVIEN
CHOPDONGCBIENCHE
Ví dụ (tt) – Dùng từ khoá new
class CNHANVIEN
{
protected int maso;
protected string hoten;
public CNHANVIEN()
{ maso = 0; hoten = ""; }
public void Nhap()
{
Console.Write("Nhap ma so nhan vien: ");
maso = int.Parse(Console.ReadLine());
Console.Write("Nhap ho ten nhan vien: ");
hoten = Console.ReadLine();
}
public void Xuat()
{
Console.WriteLine("Ma so: {0}\nHo ten: {1}", maso, hoten);
}
}
17
Ví dụ (tt) – Dùng từ khoá new
class CBIENCHE : CNHANVIEN
{
private float hesoluong;
public CBIENCHE(): base()
{ hesoluong = 0; }
public new void Nhap()
{
base.Nhap();
Console.Write("Nhap he so luong: ");
hesoluong = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("He so luong: " + hesoluong);
}
}
18
Ví dụ (tt) – Dùng từ khoá new
class CHOPDONG : CNHANVIEN
{
private float sogio;
public CHOPDONG() : base()
{ sogio = 0; }
public new void Nhap()
{
base.Nhap();
Console.Write("Nhap so gio lam viec: ");
sogio = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("So gio lam viec: " + sogio);
}
}
19
Ví dụ (tt) – Dùng virtual & override
class CNHANVIEN
{
protected int maso; protected string hoten;
public CNHANVIEN()
{
maso = 0; hoten = "";
}
public virtual void Nhap()
{
Console.Write("Nhap ma so nhan vien: ");
maso = int.Parse(Console.ReadLine());
Console.Write("Nhap ho ten nhan vien: ");
hoten = Console.ReadLine();
}
public virtual void Xuat()
{ Console.WriteLine("Ma so: {0}\nHo ten: {1}", maso, hoten);
}
}
20
Ví dụ (tt) – Dùng virtual & override
class CBIENCHE : CNHANVIEN
{
private float hesoluong;
public CBIENCHE(): base()
{ hesoluong = 0; }
public override void Nhap()
{
base.Nhap();
Console.Write("Nhap he so luong: ");
hesoluong = float.Parse(Console.ReadLine());
}
public override void Xuat()
{
base.Xuat();
Console.WriteLine("He so luong: " + hesoluong);
}
}
21
Ví dụ (tt) – Dùng virtual & override
class CHOPDONG : CNHANVIEN
{
private float sogio;
public CHOPDONG() : base()
{ sogio = 0; }
public override void Nhap()
{
base.Nhap();
Console.Write("Nhap so gio lam viec: ");
sogio = float.Parse(Console.ReadLine());
}
public override void Xuat()
{
base.Xuat();
Console.WriteLine("So gio lam viec: " + sogio);
}
}
22
Ví dụ (tt)
Hàm main dùng chung cho cả 2 cách
class Program
{
static void Main(string[] args)
{
CBIENCHE nvbc = new CBIENCHE();
nvbc.Nhap();
CHOPDONG nvhd = new CHOPDONG();
nvhd.Nhap();
Console.WriteLine("\nNhan vien bien che");
nvbc.Xuat();
Console.WriteLine("\nNhan vien hop dong");
nvhd.Xuat();
}
}
23
Các loại kế thừa
Có 3 loại kế thừa:
• public
• protected
• private
Lưu ý: Nếu không nói rõ là loại kế thừa gì, chúng ta ngầm định
đó là kế thừa public
24
Các loại kế thừa (tt)
• public: các thành phần public và protected của lớp cơ sở là
các thành phần public và protected của lớp dẫn xuất.
• protected: Các thành phần public và protected của lớp cơ
sở là các thành phần protected của lớp dẫn xuất.
• private: Các thành phần public và protected của lớp cơ sở
là các thành phần private của lớp dẫn xuất.
25
Ví dụ :
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
…………………………………………………………………………………………………………
26
Hàm dựng & hàm huỷ trong kế thừa
• Trong thừa kế, khi khởi tạo đối tượng:
▫ Hàm xây dựng của lớp cha sẽ được gọi trước
▫ Sau đó mới là hàm xây dựng của lớp con.
• Trong thừa kế, khi hủy bỏ đối tượng:
▫ Hàm hủy của lớp con sẽ được gọi trước
▫ Sau đó mới là hàm hủy của lớp cha.
27
A
B
C
Hàm dựng & hàm huỷ trong kế thừa
• Khi một đối tượng thuộc lớp dẫn xuất được
tạo lập:
▫ Hàm dựng của lớp cơ sở sẽ tự động được gọi thực
hiện trước
▫ Sau đó, hàm dựng của lớp dẫn xuất sẽ được thực
hiện.
▫ Trong hàm dựng của lớp dẫn xuất, chúng ta có thể
chỉ định hàm dựng nào của lớp cơ sở sẽ được gọi
thực hiện. Nếu không, hàm dựng mặc định của lớp
cơ sở sẽ được gọi.
28
Hàm dựng & huỷ trong kế thừa (tt)
29
class A
{
public A();
public A(int);
};
class B : public A
{
public B(int) : base(int);
};
Hàm dựng & huỷ trong kế thừa (tt)
• Ngôn ngữ C# cung cấp cơ chế thu dọn rác tự động
(garbage collection) và do vậy không cần phải khai
báo tường minh các phương thức hủy.
• Tuy nhiên, khi làm việc với các đoạn mã không được
quản lý thì cần phải khai báo tường minh các phương
thức hủy để giải phóng các tài nguyên. C# cung cấp
ngầm định một phương thức để thực hiện điều khiển
công việc này, phương thức đó là Finalize() hay còn
gọi là bộ kết thúc.
• Phương thức Finalize() này sẽ được gọi một cách tự
động bởi cơ chế thu dọn khi đối tượng bị hủy.
30
Hàm dựng & huỷ trong kế thừa (tt)
• Phương thức Finalize() chỉ giải phóng các tài nguyên
mà đối tượng nắm giữ, và không tham chiếu đến các
đối tượng khác.
• Nếu với những đoạn mã bình thường tức là chứa các
tham chiếu kiểm soát được thì không cần thiết phải
tạo và thực thi phương thức Finalize(). Ta chỉ làm
điều này khi xử lý các tài nguyên không kiểmsoát
được.
• Ta không bao giờ gọi một phương thức Finalize()
của một đối tượng một cách trực tiếp, ngoại trừ gọi
phương thức này của lớp cơ sở khi ở bên trong
phương thức Finalize() của lớp đang định nghĩa.
Trình thu dọn sẽ tự động thực hiện việc gọi
Finalize() cho chúng ta.
31
Hàm dựng & huỷ trong kế thừa (tt)
• Quá tải phương thức Finalize()
public override void Finalize()
{
// Thực hiện công việc dọn dẹp
base.Finalize();
}
32
FAQs
33
Hết chương 6
Môn Lập Trình Hướng Đối Tượng
34