Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là thừa kế. Thừa kế cho phép chúng ta định nghĩa một lớp từ một lớp khác, làm cho nó dễ dàng hơn để tạo ra và duy trì một ứng dụng. Đây cũng là cơ hội để tái sử dụng các chức năng mã và tăng tốc độ thời gian thực hiện.
Khi tạo một lớp, thay vì viết mới hoàn toàn thành phần dữ liệu và các hàm thành viên, các lập trình viên có thể chỉ định rằng lớp mới nên kế thừa những thành phần nào của một lớp hiện có, lớp hiện có này được gọi là lớp cơ sở, và lớp mới được gọi là lớp dẫn xuất.
Lớp cơ sở và dẫn xuất
Một lớp có thể được bắt nguồn từ nhiều hơn một lớp hoặc giao diện, có nghĩa là nó có thể kế thừa dữ liệu và hàm từ nhiều lớp cơ sở hoặc giao diện.
Cú pháp sử dụng trong C # để tạo các lớp dẫn xuất là như sau:
<Quyen truy cap> class <Ten_lop_co_so> { ... } class <Ten_lop_thua_ke> : <Ten_lop_co_so> { ... }
Hãy xem xét một lớp cơ sở Hinh và lớp dẫn xuất của nó HinhChuNhat:
using System; namespace InheritanceApplication { class Hinh { public void setWidth(int w) //CHIEU RONG { width = w; } public void setHeight(int h) //CHIEU DAI { height = h; } protected int width; protected int height; } // LOP THUA KE class HinhChuNhat: Hinh { public int getArea() //DIEN TICH { return (width * height); } } class RectangleTester { static void Main(string[] args) { HinhChuNhat hcn = new HinhChuNhat(); hcn.setWidth(5); hcn.setHeight(7); // IN DIEN TICH Console.WriteLine("Dien tich : {0}", hcn.getArea()); Console.ReadKey(); } } }
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:
Dien tich : 35
Khởi tạo lớp cơ sở
Các lớp được thừa kế các biến thành viên lớp cơ sở và phương thức thành viên. Do đó các đối tượng lớp siêu phải được tạo ra trước khi phân lớp được tạo ra. Bạn có thể cung cấp hướng dẫn cho việc khởi tạo lớp cha trong danh sách thành phần khởi tạo.
Chương trình sau đây chứng tỏ điều này:
using System; namespace RectangleApplication { class HCN { //BIEN THANH VIEN protected double length; protected double width; public HCN(double l, double w) { length = l; width = w; } public double GetArea() //DIEN TICH { return length * width; } public void Display() //HAM XUAT THONG TIN { Console.WriteLine("Dai: {0}", length); Console.WriteLine("Rong: {0}", width); Console.WriteLine("Dien tich: {0}", GetArea()); } }//KET THUC LOP HCN class MatBan : HCN { private double cost; public MatBan(double l, double w) : base(l, w) { } public double GetCost() //Tien mua ban { double cost; cost = GetArea() * 70; return cost; } public void Display() { base.Display(); Console.WriteLine("Gia: {0}", GetCost()); } } class ExecuteRectangle { static void Main(string[] args) { Tabletop t = new Tabletop(4.5, 7.5); t.Display(); Console.ReadLine(); } } }
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:
Dai: 4.5 Rong: 7.5 Dien tich: 33.75 Gia: 2362.5
Đa thừa kế trong C #
C # không hỗ trợ đa kế thừa. Tuy nhiên, bạn có thể sử dụng giao diện để thực hiện đa kế thừa. Chương trình sau đây chứng tỏ điều này:
using System; namespace InheritanceApplication { class Hinh { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height; } // Giao Dien public interface TienSon { int getCost(int area); } // LOP KE THUA class HCN : Hinh, TienSon { public int getArea() { return (width * height); } public int getCost(int area) { return area * 70; } } class RectangleTester { static void Main(string[] args) { HCN hcn = new HCN(); int area; hcn.setWidth(5); hcn.setHeight(7); area = hcn.getArea(); // IN DIEN TICH VA GIA TIEN Console.WriteLine("Dien tich: {0}", hcn.getArea()); Console.WriteLine("Tien son: ${0}" , hcn.getCost(area)); Console.ReadKey(); } } }
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:
Dien tich: 35 Tien son: $2450
Chúc bạn thành công !
“Một lớp có thể được bắt nguồn từ nhiều hơn một lớp hoặc giao diện” Chir kế thừ nhiều hơn một giao diện thôi bạn.