Tính kế thừa trong C#



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à Tính kế thừa (Inheritance). Tính kế thừa cho phép chúng ta định nghĩa một lớp trong điều kiện một lớp khác, mà làm cho nó dễ dàng hơn để tạo và duy trì một ứng dụng. Điều này cũng cung cấp một cơ hội để tái sử dụng tính năng code và thời gian thực thi nhanh hơn.

Khi tạo một lớp, thay vì viết toàn bộ các thành viên dữ liệu và các hàm thành viên mới, lập trình viên có thể nên kế thừa các thành viên của một lớp đang tồn tại. Lớp đang tồn tại này được gọi là Base Class - lớp cơ sở, và lớp mới được xem như là Derived Class – lớp thừa kế.

Ý tưởng của tính kế thừa triển khai mối quan hệ IS-A (Là Một). Ví dụ, mammal IS A animal, dog IS-A mammal, vì thế dog IS-A animal, và ....

Lớp cơ sở (Base Class) và Lớp thừa kế (Derived Class) trong C#

Một lớp có thể được kế thừa từ hơn một lớp khác, nghĩa là, nó có thể kế thừa dữ liệu và hàm từ nhiều Lớp hoặc Interface cơ sở.

Cú pháp để tạo lớp kế thừa trong C# là:

<acess-specifier> class <base_class>
{
   ...
}
class <derived_class> : <base_class>
{
   ...
}

Xét một lớp cơ sở Shape và lớp kế thừa Rectangle sau: tạo 3 lớp có tên lần lượt là Shape, HinhChuNhat, TestCsharp trong đó:

Lớp Shape là lớp cơ sở

using System;

namespace VietJackCsharp
{
    class Shape
    {

        protected int chieu_rong;
        protected int chieu_cao;
        public void setChieuRong(int w)
        {
            chieu_rong = w;
        }
        public void setChieuCao(int h)
        {
            chieu_cao = h;
        }
    }
}

Lớp HinhChuNhat là lớp kế thừa

using System;

namespace VietJackCsharp
{
    class HinhChuNhat : Shape
    {
        public int tinhDienTich()
        {
            return (chieu_cao * chieu_rong);
        }
    }
}
Quảng cáo

Lớp TestCsharp chứa phương thức main() để thao tác trên đối tượng HinhChuNhat

using System;
namespace VietJackCsharp
{
    public class TestCsharp
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Tinh ke thua trong C#");
            Console.WriteLine("------------------------\n");

            //tao doi tuong HinhChuNhat
            HinhChuNhat hcn = new HinhChuNhat();

            hcn.setChieuRong(5);
            hcn.setChieuCao(7);

            // in dien tich cua doi tuong.
            Console.WriteLine("Dien tich hinh chu nhat: {0}", hcn.tinhDienTich());

            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Tính kế thừa trong C#

Khởi tạo Lớp cơ sở (Base Class) trong C#

Lớp kế thừa (Derived Class) trong C# kế thừa các biến thành viên và các phương thức thành viên từ lớp cơ sở. Vì thế, đối tượng của lớp cha nên được tạo trước khi lớp phụ được tạo. Bạn có thể cung cấp các chỉ thị để khởi tạo lớp phụ trong danh sách khởi tạo thành viên.

Chương trình ví dụ sau minh họa cách khởi tạo Lớp cơ sở (Base Class) trong C#: tạo 3 lớp có tên lần lượt là HinhChuNhat, ChiPhiXayDung, TestCsharp như sau:

Lớp HinhChuNhat là lớp cơ sở

using System;

namespace VietJackCsharp
{
    class HinhChuNhat
    {
        //cac bien thanh vien
      protected double chieu_dai;
      protected double chieu_rong;
        // constructor
      public HinhChuNhat(double l, double w)
      {
         chieu_dai = l;
         chieu_rong = w;
      }
      //phuong thuc
      public double tinhDienTich()
      {
         return chieu_dai * chieu_rong;
      }
      
      public void Display()
      {
         Console.WriteLine("Chieu dai: {0}", chieu_dai);
         Console.WriteLine("Chieu rong: {0}", chieu_rong);
         Console.WriteLine("Dien tich: {0}", tinhDienTich());
      }
    }
}
Quảng cáo

Lớp ChiPhiXayDung kế thừa lớp HinhChuNhat

using System;

namespace VietJackCsharp
{
    class ChiPhiXayDung : HinhChuNhat
    {
        private double cost;
        public ChiPhiXayDung(double l, double w) : base(l, w)
      { }
      public double tinhChiPhi()
      {
         double chi_phi;
         chi_phi = tinhDienTich() * 70;
         return chi_phi;
      }
      public void hienThiThongTin()
      {
         base.Display();
         Console.WriteLine("Chi phi: {0}", tinhChiPhi());
      }
    }
}

Lớp TestCsharp chứa phương thức main() để thao tác trên đối tượng ChiPhiXayDung

using System;
namespace VietJackCsharp
{
    public class TestCsharp
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Tinh ke thua trong C#");
            Console.WriteLine("Khoi tao lop co so");
            Console.WriteLine("------------------------\n");
            //tao doi tuong ChiPhiXayDung
            ChiPhiXayDung t = new ChiPhiXayDung(4.5, 7.5);
            t.hienThiThongTin();
            Console.ReadLine();

            Console.ReadKey();
        }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Tính kế thừa trong C#

Đa kế thừa trong C#

C# không hỗ trợ đa kế thừa. Tuy nhiên, bạn có thể sử dụng Interface để triển khai đa kế thừa. Ví dụ sau minh họa cách sử dụng Interface để triển khai đa kế thừa trong C#: chúng ta tạo 2 lớp có tên lần lượt là Shape, HinhChuNhat, TestCsharp và một interface có tên là ChiPhiSon như sau:

Lớp Shape là lớp cơ sở

using System;

namespace VietJackCsharp
{
    class Shape
    {

        protected int chieu_rong;
        protected int chieu_cao;
        public void setChieuRong(int w)
        {
            chieu_rong = w;
        }
        public void setChieuCao(int h)
        {
            chieu_cao = h;
        }
    }
}

interface ChiPhiSon

using System;

namespace VietJackCsharp
{
    public interface ChiPhiSon
    {
       int tinhChiPhi(int dien_tich);
    }
}

Lớp HinhChuNhat là lớp kế thừa lớp Shape và interface ChiPhiSon

using System;

namespace VietJackCsharp
{
    class HinhChuNhat : Shape, ChiPhiSon
    {
        public int tinhDienTich()
        {
            return (chieu_rong * chieu_cao);
        }
        public int tinhChiPhi(int dien_tich)
        {
            return dien_tich * 70;
        }
    }
}

Lớp TestCsharp chứa phương thức main() để thao tác trên đối tượng HinhChuNhat

using System;
namespace VietJackCsharp
{
    public class TestCsharp
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Tinh ke thua trong C#");
            Console.WriteLine("Vi du minh hoa Da ke thua");
            Console.WriteLine("------------------------------");
            //tao doi tuong HinhChuNhat
            HinhChuNhat hcn = new HinhChuNhat();
            int dien_tich;
            hcn.setChieuRong(5);
            hcn.setChieuCao(7);
            dien_tich = hcn.tinhDienTich();

            // in dien tich va chi phi.
            Console.WriteLine("Tong dien tich: {0}", hcn.tinhDienTich());
            Console.WriteLine("Tong chi phi son: 0", hcn.tinhChiPhi(dien_tich));
            Console.ReadLine();

            Console.ReadKey();
        }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Đa kế thừa trong C#

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập doanh nghiệp với Java. Khóa học có giá chỉ 400K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp chị Thu, trợ lý anh Tuyền để hỗ trợ thanh toán qua mã QR ngân hàng Việt Nam, fb: https://www.facebook.com/Thule.59

Anh Tuyền, tác giả khóa học, là cựu sinh viên chương trình đào tạo kĩ sư tài năng của đại học Bách Khoa Hà Nội với hơn 5 năm kinh nghiệm đi làm thực tế doanh nghiệp và cũng là Founder website vietjack.com, web giáo dục phổ biến nhất Việt Nam hiện tại (năm 2024). Java cũng là ngôn ngữ lập trình dễ đi xin việc nhất hiện tại, với mức lương cao, hãy nâng cao kiến thức IT của bản thân mình vì một Việt Nam giàu mạnh.

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com




Tài liệu giáo viên