Kế thừa và đa hình trong C# với các ví dụ về chương trình

⚡ Tóm tắt thông minh

Kế thừa và đa hình là hai nguyên tắc cốt lõi của lập trình hướng đối tượng trong C#. Kế thừa cho phép lớp con tái sử dụng các trường và phương thức của lớp cha, trong khi đa hình cho phép một tên phương thức có nhiều dạng khác nhau.

  • 🧬 Di sản: Lớp con kế thừa các trường và phương thức của lớp cha và có thể thêm các trường và phương thức riêng của nó.
  • 🔒 Các thành viên được bảo vệ: Việc đánh dấu các trường của lớp cha là protected cho phép lớp con kế thừa sử dụng lại chúng trực tiếp.
  • 🧩 Đa hình: Một tên phương thức có thể có nhiều dạng khác nhau, vì vậy một lệnh gọi duy nhất sẽ hoạt động khác nhau tùy thuộc vào ngữ cảnh.
  • 🔀 Nạp chồng phương thức: Một số phương thức có cùng tên nhưng khác nhau về tham số, được xác định tại thời điểm biên dịch.
  • 🧱 Code tái sử dụng: Cả hai nguyên tắc đều giúp loại bỏ mã trùng lặp và duy trì tính nhất quán của các lớp liên quan.
  • 🤖 Hỗ trợ AI: GitHub Copilot tạo cấu trúc khung cho các lớp cơ sở và lớp dẫn xuất; ML.NET tái sử dụng hệ thống phân cấp lớp làm đầu vào cho mô hình.

Kế thừa và đa hình trong C#

Kế thừa trong C# là gì?

di sản là một khái niệm quan trọng của C#. Kế thừa là một khái niệm trong đó bạn xác định lớp cha và lớp con. Các lớp con kế thừa các phương thức và thuộc tính của lớp cha, nhưng đồng thời, chúng cũng có thể sửa đổi hành vi của các phương thức nếu cần. Lớp con cũng có thể định nghĩa các phương thức của riêng nó nếu được yêu cầu.

Chúng ta hãy hiểu rõ hơn về Kế thừa C# bằng một ví dụ về chương trình:

Ví dụ về kế thừa C#

Bây giờ hãy xem cách chúng ta có thể kết hợp khái niệm kế thừa trong mã của mình.

Bước 1) Bước đầu tiên là thay đổi mã cho lớp Hướng dẫn của chúng ta. Trong bước này, chúng tôi thêm mã bên dưới vào tệp Tutorial.cs.

Ví dụ về kế thừa C#

Lưu ý rằng bây giờ chúng ta cần thêm công cụ sửa đổi truy cập 'được bảo vệ' vào cả trường TutorialID và TutorialName.

Hãy nhớ rằng chúng ta đã đề cập đến công cụ điều chỉnh quyền truy cập này trong phần trước. Hướng dẫn về Access ModifierVâng, ở đây bạn có thể thấy mục đích của việc này. Chỉ khi có từ khóa truy cập (protected), lớp con mới có thể sử dụng các trường của lớp cha.

Bước 2) Bước thứ hai là thêm lớp con mới của chúng ta. Tên của lớp này sẽ là “Guru99Tutorial”. Ở bước này, chúng ta thêm đoạn mã sau vào tệp Tutorial.cs. Đoạn mã này nên được đặt sau phần định nghĩa lớp Tutorial.

Ví dụ về kế thừa C#

Code Giải trình:-

  1. Bước đầu tiên là tạo ra GuruLớp con 99Tutorial. Chúng ta cũng cần lưu ý rằng lớp này sẽ là lớp con của lớp Tutorial. Điều này được thực hiện bằng từ khóa ':'.
  2. Tiếp theo, chúng ta định nghĩa một phương thức có tên RenameTutorial. Nó sẽ được sử dụng để đổi tên trường TutorialName. Phương thức này chấp nhận một biến chuỗi chứa tên mới của Hướng dẫn.
  3. Sau đó chúng tôi đã gán tham số pNewName cho trường TutorialName. Lưu ý: – Mặc dù chúng tôi chưa định nghĩa trường TutorialName trong “GuruTrong lớp học “99Tutorial”, chúng ta vẫn có thể truy cập vào lĩnh vực này. Điều này là do thực tế là “Guru"99Tutorial" là một lớp con của lớp Tutorial. Và vì chúng ta đã đặt các trường của lớp Tutorial là protected, nên lớp này có thể truy cập chúng.

Bước 3) Bước cuối cùng là chỉnh sửa tệp Program.cs chính của chúng ta. Trong ứng dụng console, chúng ta sẽ tạo một đối tượng của... GuruLớp 99Tutorial. Với đối tượng này, chúng ta sẽ gọi phương thức RenameTutorial. Sau đó, chúng ta sẽ hiển thị trường TutorialName bằng cách sử dụng phương thức GetTutorial.

Ví dụ về kế thừa C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 public class Tutorial
 {
  protected int TutorialID; 
  protected string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  
  public String GetTutorial()
  {
   return TutorialName;
  }
 }
  public class Guru99Tutorial:Tutorial
  {
   public void RenameTutorial(String pNewName)
   {
    TutorialName=pNewName;
   }
  
  static void Main(string[] args) 
  {
   Guru99Tutorial pTutor=new Guru99Tutorial();
   
   pTutor.RenameTutorial(".Net by Guru99");
    
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code Giải trình:-

  1. Bước đầu tiên là tạo một đối tượng cho GuruLớp hướng dẫn 99. Việc này được thực hiện thông qua từ khóa 'new'. Lưu ý rằng lần này chúng ta không tạo một đối tượng của lớp hướng dẫn.
  2. Chúng tôi sử dụng phương pháp RenameTutorial của... GuruLớp 99Tutorial dùng để thay đổi trường TutorialName. Chúng ta truyền chuỗi “.Net by Guru99” đến phương pháp RenameTutorial.
  3. Sau đó, chúng ta gọi phương thức GetTutorial. Lưu ý rằng mặc dù phương thức này không được định nghĩa trong... GuruĐối với lớp 99Tutorial, chúng ta vẫn có thể truy cập phương thức này. Kết quả của phương thức GetTutorial sau đó được hiển thị ra console thông qua phương thức Console.WriteLine.

Nếu mã trên được nhập đúng và chương trình được thực thi thành công, kết quả sau sẽ được hiển thị.

Đầu ra:

Ví dụ về kế thừa C#

Từ kết quả đầu ra, chúng ta có thể thấy rõ ràng rằng trường TutorialName đã được đổi tên thành “.Net by” Guru99”. Điều này có thể thực hiện được nhờ phương thức RenameTutorial được gọi bởi lớp con.

Đa hình trong C# là gì?

Tính đa hình in C# Đây là một khái niệm trong lập trình hướng đối tượng (OOP) mà trong đó một tên gọi có thể có nhiều hình thức khác nhau. Ví dụ, bạn có một chiếc điện thoại thông minh để liên lạc. Chế độ liên lạc bạn chọn có thể là bất cứ thứ gì. Đó có thể là cuộc gọi, tin nhắn văn bản, tin nhắn hình ảnh, thư điện tử, v.v. Vì vậy, mục tiêu chung là liên lạc, nhưng cách tiếp cận của chúng lại khác nhau. Điều này được gọi là đa hình (Polymorphism).

Bạn sẽ hiểu rõ hơn về Đa hình C# bằng Ví dụ về chương trình bên dưới:

Ví dụ về đa hình trong C#

Bây giờ chúng ta hãy xem làm thế nào chúng ta có thể kết hợp khái niệm Đa hình trong mã của mình.

Bước 1) Bước đầu tiên là thay đổi mã cho lớp Hướng dẫn của chúng ta. Trong bước này, chúng tôi thêm mã bên dưới vào tệp Tutorial.cs.

Ví dụ về đa hình trong C#

Code Giải trình:-

1 & 2) Bước đầu tiên cũng giống như trong các ví dụ trước. Chúng ta tiếp tục...ping Định nghĩa của phương thức SetTutorial như hiện tại.

3) Phương thức này đặt TutorialID và TutorialName dựa trên các tham số pID và pName.

4) Đây là nơi chúng ta thực hiện thay đổi đối với lớp của mình, trong đó chúng ta thêm một phương thức mới có cùng tên là SetTutorial. Chỉ lần này chúng ta chỉ truyền một tham số là pName. Trong phương pháp này, chúng tôi chỉ đặt trường TutorialName thành pName.

Bước 2) Bước cuối cùng là chỉnh sửa tệp Program.cs chính của chúng ta. Trong ứng dụng console, chúng ta sẽ tạo một đối tượng của... GuruLớp học hướng dẫn 99.

Ví dụ về đa hình trong C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Tutorial
 {
  public int TutorialID; 
  public string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  public void SetTutorial(string pName) 
  {
   TutorialName=pName;
  }
  public String GetTutorial()
  {
   return TutorialName;
  }
  
  static void Main(string[] args) 
  {
   Tutorial pTutor=new Tutorial();
   
   pTutor.SetTutorial(1,"First Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
   
   pTutor.SetTutorial("Second Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code Giải trình:-

  1. Ở bước đầu tiên, chúng ta sử dụng phương thức SetTutorial với 2 tham số. Nơi chúng tôi chuyển cả TutorialID và TutorialName cho phương thức này.
  2. Ở bước thứ hai, chúng ta hiện đang gọi phương thức SetTutorial chỉ với một tham số. Chúng tôi chỉ chuyển TutorialName cho phương thức này.

Nếu mã trên được nhập đúng và chương trình được chạy, đầu ra sau sẽ được hiển thị. Trong trường hợp bạn muốn lấy cả ID hướng dẫn cùng với Tên hướng dẫn, bạn nên làm theo các bước dưới đây

  1. Tạo một phương thức riêng gọi là public int GetTutorialID
  2. Trong phương thức đó, hãy viết dòng mã “return TutorialID.” Điều này có thể được sử dụng để trả lại TutorialID cho chương trình gọi.

Đầu ra:

Ví dụ về đa hình trong C#

Từ kết quả đầu ra, chúng ta có thể thấy rõ rằng cả hai phương thức đều được gọi thành công. Do đó, các chuỗi “Hướng dẫn đầu tiên” và “Hướng dẫn thứ hai” đã được gửi tới bảng điều khiển.

Câu Hỏi Thường Gặp

C# hỗ trợ kế thừa đơn cấp, đa cấp và phân cấp thông qua các lớp. Kế thừa đa cấp chỉ có thể thực hiện thông qua giao diện.

Không. Lớp AC# chỉ kế thừa từ một lớp cơ sở duy nhất. Kế thừa đa lớp sử dụng nhiều giao diện khác nhau.

Nạp chồng (Overloading) sử dụng một tên phương thức với các tham số khác nhau tại thời điểm biên dịch. Ghi đè (Overriding) định nghĩa lại một phương thức cơ sở ảo tại thời điểm chạy.

Từ khóa `virtual` cho phép ghi đè một phương thức của lớp cơ sở; từ khóa `override` định nghĩa lại phương thức đó trong lớp dẫn xuất.

Từ khóa `base` cho phép lớp dẫn xuất gọi hàm tạo của lớp cha hoặc truy cập các thành viên ẩn hoặc được ghi đè của lớp cơ sở.

Đánh dấu lớp là sealed. Một lớp sealed không thể là lớp cơ sở, ngăn chặn việc kế thừa tiếp theo và cải thiện hiệu năng.

Đúng vậy. GitHub Copilot tạo cấu trúc tự động cho các lớp cơ sở và lớp con, đồng thời thêm các phương thức ảo và ghi đè từ chú thích hoặc tên lớp.

ML.NET định nghĩa các lớp dữ liệu và dự đoán kế thừa các thành viên dùng chung, và quy trình xử lý dữ liệu của nó tái sử dụng một kiểu cơ sở transformer chung.

Tóm tắt bài viết này với: