0

Tính kế thừa trong C

15 10 0
  • Tính kế thừa trong C

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Tài liệu liên quan

Thông tin tài liệu

Ngày đăng: 15/01/2022, 11:24

Trong đời sống thực tế, kế thừa là việc được thừa hưởng những gì của người đi trước để lại. Ví dụ như ba để lại cho con một mảnh đất, vậy là người con được thừa kế mảnh đất đó mà không cần phải kiếm tiền mua đất hay phải đi tìm mua đất nữa, giờ chỉ việc xây nhà trên mảnh đất được thừa kế đó. Trong lập trình, tính kế thừa cũng có những điểm tương tự. Trong chương 6 này, ta sẽ tìm hiểu mối quan hệ giữa các đối tượng trong thế giới thực và cách thức mô hình hóa mối quan hệ này trong mã chương trình dựa trên khái niệm kế thừa. BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC KINH TẾ THÀNH PHỐ HỒ CHÍ MINH MƠN CƠ SỞ LẬP TRÌNH ~~~~~~*~~~~~~ BÀI TIỂU LUẬN CHƯƠNG 6: TÍNH THỪA KẾ TRONG C# Sinh viên thực Mã sinh viên Lớp Khóa : : : : Nguyễn Thị Như Ngọc 31191026004 EC001 45 TPHCM – 6/2021 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH MỤC LỤC TRANG I QUAN HỆ ĐẶC BIỆT HÓA- TỔNG QUÁT HÓA II TÍNH KẾ THỪA TRONG C# Định nghĩa .4 Ý nghĩa Cú pháp để tạo lớp kế thừa III VIẾT CHƯƠNG TRÌNH CĨ THỪA KẾ Sử dụng từ khóa new .5 Sử dụng từ khóa virtual override 10 TÀI LIỆU THAM KHẢO .15 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH CHƯƠNG TÍNH THỪA KẾ TRONG C# Trong đời sống thực tế, kế thừa việc thừa hưởng người trước để lại Ví dụ ba để lại cho mảnh đất, người thừa kế mảnh đất mà khơng cần phải kiếm tiền mua đất hay phải tìm mua đất nữa, việc xây nhà mảnh đất thừa kế Trong lập trình, tính kế thừa có điểm tương tự Trong chương này, ta tìm hiểu mối quan hệ đối tượng giới thực cách thức mơ hình hóa mối quan hệ mã chương trình dựa khái niệm kế thừa I QUAN HỆ ĐẶC BIỆT HÓA- TỔNG QUÁT HÓA Lớp thể lớp tức đối tượng không tồn khối, chúng tồn mạng lưới có phụ thuộc quan hệ lẫn Quan hệ (is-a) đặc biệt hóa Khi nói mèo loại động vật có vú, có nghĩa nói mèo trường hợp đặc biệt loại động vật có vú Nó có tất đặc tính động vật có vú (như sinh con, có sữa mẹ có lơng…) Tuy nhiên, mèo có thêm đặc tính riêng xác định họ nhà mèo mà họ động vật có vú khác khơng có Tương tự, chó loại động vật có vú, có tất thuộc tính động vật có vú, khơng cịn có thêm thuộc tính riêng xác định họ lồi chó mà khác với thuộc tính đặc biệt lồi khác Quan hệ đặc biệt hóa - tổng quát hóa hai mối quan hệ đối ngẫu phân cấp với Chúng có quan hệ đối ngẫu xem mặt ngược lại tổng qt Do đó, lồi chó mèo trường hợp đặc biệt động vật có vú Ngược lại động vật có vú trường hợp tổng qt từ lồi chó mèo Chúng có quan hệ phân cấp chúng tạo quan hệ, trường hợp đặc biệt nhánh trường hợp tổng quát Trong phân cấp di chuyển lên ta trường hợp tổng quát hóa, ngược lại di chuyển xuống ngược nhánh ta trường hợp đặc biệt hóa Ta có sơ đồ phân cấp minh họa cho lồi chó, mèo động vật có vú sau: TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH Trong C#, quan hệ chun biệt hóa - tổng qt hố thể thơng qua kế thừa thơng thường hai lớp chia sẻ chức năng, liệu với nhau, ta trích phần chung đưa vào lớp sở chung để nâng cao khả sử dụng lại mã nguồn chung, dễ dàng quản lý mã nguồn Ví dụ: Giả sử ta có lớp TuGiac chứa thơng tin toạ độ điểm A, B, C, D Ta biết hình vng trường hợp đặc biệt tứ giác (ngược lại tứ giác trường hợp tổng qt hình vng) Từ ta cho lớp HinhVuong kế thừa lại lớp TuGiac để sử dụng lại thông tin tọa độ điểm A, B, C, D mà không cần phải khai báo II TÍNH KẾ THỪA TRONG C# Định nghĩa Trong ngơn ngữ C#, quan hệ đặc biệt hóa thực thi cách sử dụng kế thừa Đây cách để thực thi đặc biệt hóa, cách chung tự nhiên để thực thi quan hệ Trong mô hình trước, ta nói Mèo kế thừa từ Động vật có vú Động vật có vú xem lớp cha, Mèo xem lớp Như vậy, Mèo thừa kế tất thuộc tính hành động từ lớp Động vật có vú thêm phần đặc biệt riêng để xác nhận Mèo Kế thừa chế cho phép định nghĩa lớp (còn gọi lớp dẫn xuất Derived Class) dựa lớp có sẵn (còn gọi lớp sở - Base Class.) Lớp dẫn xuất có hầu hết thành phần giống lớp sở (bao gồm tất thuộc tính (dữ liệu) phương thức lớp sở) Nói cách khác, lớp dẫn xuất kế thừa hầu hết thành viên lớp sở Ý nghĩa Kế thừa đem lại nhiều ý nghĩa cho việc lập trình: - Tính qn: đối tượng có chung nguồn gốc có đặc điểm chung giống - Tái sử dụng code: phần code chung cần định nghĩa lần lớp cha (Base Class), lớp (Derived Class) sử dụng mà không cần viết lại - Thuận tiện việc bảo trì phát triển Khi sửa lỗi hay nâng cấp cần định nghĩa lại lớp cha Cú pháp để tạo lớp kế thừa [] class { } [] class : { TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH } : public hay private, protected,… Có thể có khơng class từ khoá để khai báo lớp tên lớp dẫn xuất – Derived Class, người dùng đặt tuân theo quy tắc đặt tên tên lớp sở – Base Class , lớp ta muốn kế thừa đặc tính III VIẾT CHƯƠNG TRÌNH CĨ THỪA KẾ Sử dụng từ khóa new Cú pháp lớp kế thừa có sử dụng từ khóa new: class Base1 //lop co so { private type data1; private type data2; public void Method1() { } public void Method 2() { } } // -class Derived1: Base1 //lop dan xuat { private type data3; // du lieu moi cua lop Derived1 public new void Method1 () { } public new void Method2 () { } } // -class Derived2: Base1 //lop dan xuat { private type data4; // du lieu moi cua lop Derived public new void Method1 () { } public new void Method2 () { } } Trong cú pháp trên: TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH public new void Method1 () Từ khóa new kế thừa khơng phải tốn tử dùng để khởi tạo đối tượng, mà modifier dùng để xác định phạm vi phương thức Trong trường hợp lý đó, muốn tạo phương thức lớp có tên giống với tên phương thức lớp cha, để tránh nhập nhằng phương thứ này, ta cần gắn từ khóa new cho phương thức lớp Từ khóa new sử dụng để người lập trình tạo phiên cho phương thức bên lớp Ví dụ 6.1 Hãy viết chương trình có thừa kế cho trò chơi Plants and Zombies để quản lý lớp thuộc lớp sở Plants (thực vật): lớp Đậu bắn súng (Peashooter), lớp Đậu tuyết (SnowPea) lớp Hoa hướng dương (Sunflower) using System; class Plants { private int Health; private int Money; private string Level; public Plants() { Health = 0; Money = 0; Level = ""; } public void Input() { Console.Write("Input Level: "); Level = Console.ReadLine(); Console.Write("Input Health: "); Health = Int32.Parse(Console.ReadLine()); Console.Write("Input Money: "); Money = Int32.Parse(Console.ReadLine()); } public void Show() { Console.WriteLine("Level: " + Level + " | Health: " + Health + "HP | Money: " + Money + "$"); } } class Peashooter : Plants TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH { private string description; public Peashooter() : base() { description = ""; } public new void Input() { base.Input(); Console.Write("Input the description: "); description = Console.ReadLine(); } public new void Show() { base.Show(); Console.WriteLine("Description: " + description); } } class SnowPea : Plants { private string description; public SnowPea() : base() { description = ""; } public new void Input() { base.Input(); Console.Write("Input the description: "); description = Console.ReadLine(); } public new void Show() { base.Show(); Console.WriteLine("Description: " + description); } } class Sunflower: Plants { } TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH public class InherMain { public static void Main(string[] args) { Peashooter s1 = new Peashooter(); Console.WriteLine("Peashooter."); s1.Input(); s1.Show(); Console.WriteLine("SnowPea."); SnowPea m1 = new SnowPea(); m1.Input(); m1.Show(); Sunflower w1 = new Sunflower(); Console.WriteLine("Sunflower"); w1.Input(); w1.Show(); Console.ReadLine(); } } Kết quả: Peashooter Input Level: From the start Input Health: 80 Input Money: 100 Input the description: Use beans to shoot zombies Level: From the start | Health: 80HP | Money:100$ Description: Use beans to shoot zombies SnowPea Input Level: 1-6 Input Health: 100 Input Money: 175 Input the description: Use ice bullets to shoot zombies Level: 1-6 | Health: 100HP | Money:175$ Description: Use ice bullets to shoot zombies Sunflower Input Level: After win 1st round Input Health: 60 Input Money: 50 Level: After win 1st round | Health: 60HP | Money: 50$ TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH Trong ví dụ trên, lớp Plants có phương thức Show( ), nhiên phương thức xuất thông tin Level, Health, Money nên khơng cịn phù hợp với hai lớp Peashooter SnowPea Do hai lớp dẫn xuất định nghĩa phiên phương thức Show theo cú pháp sau: public new void Show() { … } Việc thêm vào từ khóa new người lập trình muốn tạo phiên phương thức lớp dẫn xuất nhằm che dấu phương thức kế thừa từ lớp sở Plants Như vậy, hàm Main(), gọi: s1.Show(); m1.Show(); trình biên dịch hiểu phương thức Show() lớp Peashooter lớp SnowPea Trong ví dụ trên, định nghĩa lớp thừa kế ta dùng dấu hai chấm: để tách hai lớp dẫn xuất lớp sở Dấu hai chấm biểu diễn kế thừa lớp C# class Peashooter: Plant { } Đối với hàm tạo (constructor) lớp thừa kế ta phải nhớ có hàm với từ khóa base() nằm sau dấu hai chấm: public Peashooter() : base() { description = ""; } Các hàm thành viên, chẳng hạn, hàm Input(), hàm Show() lớp có tên giống Các hàm gọi hàm trùng tên hay nạp chồng (overloading function) Việc gọi hàm thành viên có lớp sở, ta phải dùng từ khóa base truy cập qua tốn tử chấm base.Input(); TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH Khi khai báo đối tượng hàm Main(), ta không quan tâm tới lớp sở Đối tượng thuộc lớp dẫn xuất khai báo kiểu lớp dẫn xuất Peashooter s1 = new Peashooter(); SnowPea m1 = new SnowPea(); Sunflower w1 = new Sunflower(); Khi định nghĩa hàm thành viên lớp sở, phải nhớ đặt từ khóa new sau từ khóa public trước từ khóa void Sử dụng từ khóa virtual override Overriding cho method tính cho phép lớp định nghĩa lại phương thức lớp cha Phương thức khai báo lớp phải tên, tham số mà lớp cha khai báo Các biến thuộc lớp sở khai báo theo kiểu private (hoặc protected) Các biến thuộc lớp dẫn xuất khai báo theo kiểu private Các hàm thành viên thuộc lớp sở phải có từ khóa virtual trước từ khóa void Các hàm thành viên thuộc lớp dẫn xuất phải có từ khóa override trước từ khóa void Cú pháp sau: class Base1 { private int a,b; public virtual void Method1() { } class Derived: Base1 { private int c; public override void Show() { } } Ví dụ 6.2 Viết lại chương trình ví dụ 6.1 theo cách sử dụng từ khóa virtual override using System; class Plants { private int Health; private int Money; private string Level; public Plants() { Health = 0; 10 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH Money = 0; Level = ""; } public virtual void Input() { Console.Write("Input Level: "); Level = Console.ReadLine(); Console.Write("Input Health: "); Health = Int32.Parse(Console.ReadLine()); Console.Write("Input Money: "); Money = Int32.Parse(Console.ReadLine()); } public virtual void Show() { Console.WriteLine("Level: " + Level + " Health: " + Health + "HP | Money: " + Money + "$"); } | } class Peashooter : Plants { private string description; public Peashooter() : base() { description = ""; } public override void Input() { base.Input(); Console.Write("Input the description: "); description = Console.ReadLine(); } public override void Show() { base.Show(); Console.WriteLine("Description: " + description); } } class SnowPea : Plants { 11 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH private string description; public SnowPea() : base() { description = ""; } public override void Input() { base.Input(); Console.Write("Input the description: "); description = Console.ReadLine(); } public override void Show() { base.Show(); Console.WriteLine("Description: " + description); } } class Sunflower: Plants { } public class InherMain { public static void Main(string[] args) { Peashooter s1 = new Peashooter(); Console.WriteLine("Peashooter."); s1.Input(); s1.Show(); Console.WriteLine("SnowPea."); SnowPea m1 = new SnowPea(); m1.Input(); m1.Show(); Sunflower w1 = new Sunflower(); Console.WriteLine("Sunflower"); w1.Input(); w1.Show(); Console.ReadLine(); } } Kết tương tự kết chương trình ví dụ 6.1 12 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH Ví dụ 6.3: Viết chương trình có thừa kế để thể lớp học có học sinh đến từ nhiều quốc gia khác Sử dụng từ khóa virtual override cho phương thức đưa lời chào Greet using System; namespace Cuoiky { class Person { protected string name; protected int age; public Person(string name, int age) { this.name = name; this.age = age; } public virtual void Greet() { } } class Vietnamese : Person { public Vietnamese(string name, int age) : base(name, age) { } public override void Greet() { Console.WriteLine("Xin chao Minh ten la {0} Nam minh {1} tuoi.", this.name, this.age); } } class American : Person { public American(string name, int age) : base(name, age) { } public override void Greet() { Console.WriteLine("Hello My name is {0} I am {1} years old.", this.name, this.age); } } class French : Person { 13 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH public French(string name, int age) : base(name, age) { } public override void Greet() { Console.WriteLine("Bonjour, je m'appelle {0} J'ai {1} ans.", this.name, this.age); } } class ExamInherit { static void Main(string[] args) { Person[] students = new Person[3]; students[0] = new Vietnamese("Ngoc", 20); students[1] = new American("Rosie", 24); students[2] = new French("Francois", 19); for (int i = 0; i < 3; i++) { students[i].Greet(); } Console.ReadLine(); } } } Kết quả: Xin chao Minh ten la Ngoc Nam minh 20 tuoi Hello My name is Rosie I am 24 years old Bonjour, je m'appelle Francois J'ai 19 ans 14 TRƯỜNG ĐẠI HỌC KINH TẾ TPHCM – CƠ SỞ LẬP TRÌNH TÀI LIỆU THAM KHẢO Bài giảng Lập trình hướng đối tượng tác giả Phạm Quang Huy https://www.slideshare.net/vanducld/lap-trinh-huong-doi-tuong-25922240 Tính kế thừa lập trình C# http://minhhn.com/lap-trinh-c-sharp/tinh-ke-thua-trong-lap-trinh-csharp/ Thừa kế C# http://code5s.com/thua-ke-trong-c/?fbclid=IwAR1eCFCQseGhXwvgjbbsEHekVPBcW7M0znYe0-7XMApNl3AtlcKi0G6Cdo Kế thừa Lập trình hướng đối tượng https://www.howkteam.vn/course/lap-trinh-oop-voi-c/ke-thua-trong-lap-trinh-huong-doi-tuong1379 Khái niệm kế thừa (Inheritance) https://nguyenanhtuanweb.wordpress.com/2018/03/16/tinh-ke-thua-trong-c/ Tính kế thừa C# https://www.quantrimaytinh.com/2020/04/tinh-ke-thua-trong-c-sharp.html 15 ... khơng c? ??n phải khai báo II TÍNH KẾ THỪA TRONG C# Định nghĩa Trong ngôn ngữ C# , quan hệ đ? ?c biệt hóa th? ?c thi c? ?ch sử dụng kế thừa Đây c? ?ch để th? ?c thi đ? ?c biệt hóa, c? ?ch chung tự nhiên để th? ?c thi... vật c? ? vú kh? ?c khơng c? ? Tương tự, chó loại động vật c? ? vú, c? ? tất thu? ?c tính động vật c? ? vú, khơng c? ??n c? ? thêm thu? ?c tính riêng x? ?c định họ lồi chó mà kh? ?c với thu? ?c tính đ? ?c biệt lồi kh? ?c Quan... https://www.slideshare.net/vanducld/lap-trinh-huong-doi-tuong-25922240 Tính kế thừa lập trình C# http://minhhn.com/lap-trinh -c- sharp/tinh-ke-thua -trong- lap-trinh-csharp/ Thừa kế C# http://code5s.com/thua-ke -trong- c/ ?fbclid=IwAR1eCFCQseGhXwvgjbbsEHekVPBcW7M0znYe0-7XMApNl3AtlcKi0G6Cdo
- Xem thêm -

Xem thêm: Tính kế thừa trong C, Tính kế thừa trong C