Chương 4 của bài giảng Lập trình hướng đối tượng (Dùng C#) trình bày về kế thừa lớp đối tượng với những nội dung sau đây: Khái niệm về tính kế thừa, thiết kế lớp kế thừa, thiết lập và hủy trong kế thừa. Mời các bạn cùng tham khảo.
Chương Kế thừa lớp đối tượng TRẦN MINH THÁI Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn Cập nhật: 15 tháng 03 năm 2013 Nội dung #2 Khái niệm tính kế thừa Thiết kế lớp kế thừa Thiết lập hủy kế thừa Đặt vấn đề #3 Giả sử xây dựng lớp CDate hoàn chỉnh Cần xây dựng ứng dụng tính tiền lãi mợt ngân hàng thành lập ngày 14/3/1997 Cần xây dựng ứng dụng quản lý sinh viên có tḥc tính ngày tháng năm sinh (sinh viên phải từ 17 tuổi trở lên) Đặt vấn đề #4 Cách 1: Sửa lại lớp CDate cho phù hợp với yêu cầu lớp CDate ứng dụng Sửa lại hàm kiểm tra Ảnh hưởng đến chương trình khác có sử dụng lớp CDate dạng tổng quát Đặt vấn đề #5 Cách 2: Xây dựng lớp CDate độc lập với lớp CDate Tốn nhiều công sức Cách 3: Sao chép lớp CDate để tạo lớp CDate sau sửa lại theo yêu cầu chương trình Khó khăn thực thủ cơng mở rộng, cập nhật, Đặt vấn đề #6 Cần có chế cho phép khai báo lớp CDate lớp CDate cũ với số sửa đổi bổ sung Đặt vấn đề #7 Tương tự cho chương trình đánh caro, cờ tướng máy tính Mỡi qn cờ được xem điểm ký tự (CDiemKT) mỡi qn cờ có những đặc điểm khác Do cần sử dụng lớp CDiemKT bổ sung sửa đổi một số phần tốn công sức để xây dựng lại từ đầu Khái niệm #8 Kế thừa cho phép khai báo lớp B lớp dẫn xuất từ lớp A Khi B sẽ có tất tḥc tính đặc điểm A, ngồi B có thể có thêm những tḥc tính những hành đợng Khái niệm #9 Kế thừa thể khả tái sử dụng lớp được định nghĩa Có thể định nghĩa lớp đối tượng dựa hay nhiều lớp đới tượng có sẵn Lớp có sẵn được gọi lớp sở (based class) lớp kế thừa được gọi lớp dẫn xuất (derived class) Khái niệm #10 A - - *- - *- *- - * -* C B * * * * * +*+++*+* +*+++*+ A B - * tính chất chung - tính chất A + tính chất B 10 +++++++ +++ Ví dụ – Dùng từ khố new #20 class CBIENCHE : CNHANVIEN { private float hesoluong; 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: " + 20 Ví dụ – Dùng từ khố new #21 class CHOPDONG : CNHANVIEN { private float sogio; 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); } 21 Ví dụ – Dùng virtual & override #22 class CNHANVIEN { protected int maso; protected string 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); } } 22 Ví dụ – Dùng virtual & override #23 class CBIENCHE : CNHANVIEN { private float hesoluong; 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); } } 23 Ví dụ – Dùng virtual & override #24 class CHOPDONG : CNHANVIEN { private float sogio; 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); } 24 Ví dụ - Sử dụng phương thức Main() #25 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(); } 25 Phạm vi kế thừa #26 Có phạm vi kế thừa: public protected private Lưu ý: Nếu khơng nói rõ phạm vi kế thừa gì, ngầm định kế thừa public 26 Phạm vi kế thừa #27 public: thành phần public & protected lớp sở thành phần public & protected lớp dẫn xuất protected: thành phần public & protected lớp sở thành phần protected lớp dẫn xuất private: thành phần public & protected lớp sở thành phần private lớp dẫn xuất 27 Phương thức thiết lập & huỷ kế thừa #28 Khi khởi tạo đối tượng: Phương thức thiết lập lớp cha sẽ được gọi trước Sau phương thức thiết lập lớp Khi hủy đối tượng: Phương thức hủy lớp sẽ được gọi trước Sau phương thức hủy lớp cha 28 Phương thức thiết lập & huỷ kế thừa #29 A B C Phương thức thiết lập & huỷ kế thừa #30 Trong phương thức thiết lập lớp dẫn xuất, có thể định phương thức thiết lập lớp sở sẽ được gọi thực Nếu không định, phương thức thiết lập mặc định lớp sở sẽ được gọi 30 Phương thức thiết lập & huỷ kế thừa #31 class A { public A(){} public A(int){} } class B : public A { public B(int) //Thực A() {} } 31 Phương thức thiết lập & huỷ kế thừa #32 class A { public A(){} public A(int){} } class B : public A { public B(int) : base(int) //Thực A(int) {} } 32 Bài tập #33 Thiết kế chương trình quản lý đối tượng sau Viện khoa học: nhà khoa học, nhà quản lý NV phòng thí nghiệm Các thành phần liệu đối tượng trên: Nhà khoa học: họ tên, năm sinh, cấp, chức vụ, số báo công bố, số ngày công tháng, bậc lương Nhà quản lý họ tên, năm sinh, cấp, chức vụ, số ngày công tháng, bậc lương NV phòng thí nghiệm: họ tên, năm sinh, cấp, lương tháng Thực yêu cầu sau: Các phương thức thiết lập để nhập liệu, biết nhân viên phòng thí nghiệm lãnh lương khoán, lương nhà khoa học nhà quản FAQs #34 34 ... được gọi lớp dẫn xuất (derived class) Khái niệm #10 A - - *- - *- *- - * -* C B * * * * * +*+++*+* +*+++*+ A B - * tính chất chung - tính chất A + tính chất B 10 +++++++ +++ Ký hiệu #11... thiết lập & huỷ kế thừa #32 class A { public A(){} public A(int){} } class B : public A { public B(int) : base(int) //Thực A(int) {} } 32 Bài tập #33 Thiết kế chương trình quản lý đối tượng sau... cha 28 Phương thức thiết lập & huỷ kế thừa #29 A B C Phương thức thiết lập & huỷ kế thừa #30 Trong phương thức thiết lập lớp dẫn xuất, có thể định phương thức thiết lập lớp sở sẽ được gọi