การสืบทอด C # และความหลากหลายพร้อมตัวอย่างโปรแกรม

⚡ สรุปอย่างชาญฉลาด

การสืบทอดและการพหุรูปใน C# เป็นหลักการสำคัญสองประการของการเขียนโปรแกรมเชิงวัตถุ การสืบทอดช่วยให้คลาสลูกสามารถนำฟิลด์และเมธอดของคลาสแม่มาใช้ซ้ำได้ ในขณะที่การพหุรูปช่วยให้ชื่อเมธอดหนึ่งชื่อสามารถมีได้หลายรูปแบบ

  • 🧬 มรดก: คลาสลูกจะสืบทอดฟิลด์และเมธอดจากคลาสแม่ และสามารถเพิ่มฟิลด์และเมธอดของตนเองได้
  • 🔒 สมาชิกที่ได้รับการคุ้มครอง: การกำหนดให้ฟิลด์ของคลาสแม่เป็น protected จะช่วยให้คลาสลูกที่สืบทอดมาสามารถนำฟิลด์เหล่านั้นไปใช้ซ้ำได้โดยตรง
  • 🧩 ความหลากหลาย: ชื่อเมธอดหนึ่งชื่ออาจมีหลายรูปแบบ ดังนั้นการเรียกใช้เพียงครั้งเดียวจึงอาจมีพฤติกรรมแตกต่างกันไปตามบริบท
  • 🔀 การโอเวอร์โหลดเมธอด: มีหลายเมธอดที่มีชื่อเดียวกัน แต่แตกต่างกันในพารามิเตอร์ ซึ่งจะถูกกำหนดในขั้นตอนการคอมไพล์
  • 🧱 Code นำกลับมาใช้ใหม่: หลักการทั้งสองนี้ช่วยลดโค้ดที่ซ้ำซ้อนและทำให้คลาสที่เกี่ยวข้องมีความสอดคล้องกัน
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot สร้างโครงสร้างพื้นฐานของคลาสพื้นฐานและคลาสที่สืบทอดมา ในขณะที่ ML.NET นำลำดับชั้นของคลาสมาใช้ซ้ำเป็นข้อมูลป้อนเข้าของโมเดล

การสืบทอดและโพลีมอร์ฟิซึมใน C#

การสืบทอดใน C # คืออะไร?

มรดก เป็นแนวคิดที่สำคัญของ C# การสืบทอดเป็นแนวคิดที่คุณกำหนดคลาสพาเรนต์และคลาสลูก คลาสลูกสืบทอดวิธีการและคุณสมบัติของคลาสพาเรนต์ แต่ในขณะเดียวกัน คลาสลูกก็สามารถปรับเปลี่ยนพฤติกรรมของเมธอดได้หากต้องการ คลาสย่อยยังสามารถกำหนดวิธีการของตนเองได้หากต้องการ

มาทำความเข้าใจเกี่ยวกับการสืบทอด C# กันดีกว่าโดยตัวอย่างโปรแกรม:

ตัวอย่างการสืบทอด C#

ตอนนี้เรามาดูกันว่าเราจะรวมแนวคิดเรื่องการสืบทอดในโค้ดของเราได้อย่างไร

ขั้นตอน 1) ขั้นตอนแรกคือการเปลี่ยนโค้ดสำหรับคลาสการสอนของเรา ในขั้นตอนนี้ เราจะเพิ่มโค้ดด้านล่างลงในไฟล์ Tutorial.cs

ตัวอย่างการสืบทอด C#

โปรดทราบว่าตอนนี้เราจำเป็นต้องเพิ่มตัวแก้ไขการเข้าถึงของ 'protected' ให้กับทั้งฟิลด์ TutorialID และ TutorialName

จำได้ไหมที่เราเคยพูดถึงตัวแก้ไขการเข้าถึงนี้ใน... คู่มือการใช้งาน Access Modifier. ตรงนี้คุณจะเห็นถึงจุดประสงค์ของการมีตัวแก้ไขการเข้าถึงนี้ เฉพาะเมื่อคุณมีตัวแก้ไขการเข้าถึง (protected) เท่านั้น คลาสลูกจึงจะสามารถใช้ฟิลด์ของคลาสแม่ได้

ขั้นตอน 2) ขั้นตอนที่สองคือการเพิ่มคลาสย่อยใหม่ของเรา ชื่อของคลาสนี้จะเป็น “Guru99Tutorial” ในขั้นตอนนี้ เราจะเพิ่มโค้ดด้านล่างลงในไฟล์ Tutorial.cs โดยโค้ดควรวางไว้หลังการนิยามคลาส Tutorial

ตัวอย่างการสืบทอด C#

Code คำอธิบาย:-

  1. ขั้นตอนแรกคือการสร้าง Guruคลาสลูก 99Tutorial เราต้องระบุด้วยว่าคลาสนี้จะเป็นคลาสลูกของคลาส Tutorial โดยใช้คีย์เวิร์ด ':'
  2. ต่อไป เราจะกำหนดวิธีการที่เรียกว่า RenameTutorial มันจะใช้เพื่อเปลี่ยนชื่อฟิลด์ TutorialName เมธอดนี้ยอมรับตัวแปรสตริงซึ่งมีชื่อใหม่ของบทช่วยสอน
  3. จากนั้นเรากำหนดพารามิเตอร์ pNewName ให้กับฟิลด์ TutorialName หมายเหตุ: – แม้ว่าเราจะไม่ได้กำหนดฟิลด์ TutorialName ใน “Guruในคลาส “99Tutorial” เรายังคงสามารถเข้าถึงฟิลด์นี้ได้ เนื่องจากข้อเท็จจริงที่ว่า “Guru"99Tutorial" เป็นคลาสลูกของคลาส Tutorial และเนื่องจากเรากำหนดให้ฟิลด์ของคลาส Tutorial เป็นแบบ protected ฟิลด์เหล่านั้นจึงสามารถเข้าถึงได้จากคลาสนี้

ขั้นตอน 3) ขั้นตอนสุดท้ายคือการแก้ไขไฟล์ Program.cs หลักของเรา ในแอปพลิเคชันคอนโซลของเรา เราจะสร้างอ็อบเจ็กต์ของ... Guruคลาส 99Tutorial เราจะใช้ object นี้เรียกเมธอด RenameTutorial จากนั้นเราจะแสดงฟิลด์ TutorialName โดยใช้เมธอด GetTutorial

ตัวอย่างการสืบทอด 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 คำอธิบาย:-

  1. ขั้นตอนแรกคือการสร้างวัตถุสำหรับ Guruคลาส Tutorial 99 สร้างขึ้นโดยใช้คีย์เวิร์ด 'new' โปรดสังเกตว่าในครั้งนี้เราไม่ได้สร้างอ็อบเจ็กต์ของคลาส Tutorial
  2. เราใช้วิธี RenameTutorial ของ Guruคลาส 99Tutorial เพื่อเปลี่ยนฟิลด์ TutorialName เราส่งสตริง “.Net by” Guru99” ไปยังเมธอด RenameTutorial
  3. จากนั้นเราเรียกเมธอด GetTutorial โปรดทราบว่าถึงแม้เมธอดนี้จะไม่ได้ถูกกำหนดไว้ใน Guruในคลาส 99Tutorial เรายังคงสามารถเข้าถึงเมธอดนี้ได้ โดยผลลัพธ์ของเมธอด GetTutorial จะถูกแสดงไปยังคอนโซลผ่านเมธอด Console.WriteLine

หากป้อนโค้ดด้านบนถูกต้องแล้วและโปรแกรมทำงานสำเร็จจะแสดงผลลัพธ์ต่อไปนี้

Output:

ตัวอย่างการสืบทอด C#

จากผลลัพธ์ เราจะเห็นได้อย่างชัดเจนว่าฟิลด์ TutorialName ถูกเปลี่ยนชื่อเป็น “.Net” Guru99” ซึ่งเป็นไปได้ด้วยเมธอด RenameTutorial ที่เรียกใช้โดยคลาสลูก

Polymorphism ใน C # คืออะไร?

ความหลากหลาย in C# เป็นแนวคิดใน OOP ที่ชื่อหนึ่งสามารถมีได้หลายรูปแบบ ตัวอย่างเช่น คุณมีสมาร์ทโฟนสำหรับการสื่อสาร โหมดการสื่อสารที่คุณเลือกอาจเป็นอะไรก็ได้ อาจเป็นการโทร ข้อความ รูปภาพ อีเมล ฯลฯ ดังนั้นเป้าหมายจึงเหมือนกัน คือการสื่อสาร แต่รูปแบบการใช้งานแตกต่างกัน นี่เรียกว่า โพลีมอร์ฟิซึม (Polymorphism)

คุณจะได้รับความเข้าใจที่ดีขึ้นเกี่ยวกับ C# Polymorphism จากตัวอย่างโปรแกรมด้านล่าง:

ตัวอย่างความหลากหลาย C#

ตอนนี้เรามาดูกันว่าเราจะรวมแนวคิดเรื่องความหลากหลายในโค้ดของเราได้อย่างไร

ขั้นตอน 1) ขั้นตอนแรกคือการเปลี่ยนโค้ดสำหรับคลาสการสอนของเรา ในขั้นตอนนี้ เราจะเพิ่มโค้ดด้านล่างลงในไฟล์ Tutorial.cs

ตัวอย่างความหลากหลาย C#

Code คำอธิบาย:-

1 & 2) ขั้นตอนแรกเหมือนกับตัวอย่างก่อนหน้านี้ เราต้อง...ping นิยามของเมธอด SetTutorial ตามที่เป็นอยู่

3) วิธีการนี้จะตั้งค่า TutorialID และ TutorialName ตามพารามิเตอร์ pID และ pName

4) นี่คือจุดที่เราทำการเปลี่ยนแปลงชั้นเรียนของเรา โดยที่เราเพิ่มวิธีการใหม่ด้วยชื่อเดียวกันของ SetTutorial เฉพาะครั้งนี้เราส่งผ่านพารามิเตอร์เดียวเท่านั้นซึ่งก็คือ pName ในวิธีนี้ เราเพียงแค่ตั้งค่าฟิลด์ของ TutorialName เป็น pName

ขั้นตอน 2) ขั้นตอนสุดท้ายคือการแก้ไขไฟล์ Program.cs หลักของเรา ในแอปพลิเคชันคอนโซลของเรา เราจะสร้างอ็อบเจ็กต์ของ... Guruคลาสเรียน 99Tutorial

ตัวอย่างความหลากหลาย 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 คำอธิบาย:-

  1. ในขั้นตอนแรก เราใช้เมธอด SetTutorial ที่มี 2 พารามิเตอร์ โดยที่เราจะส่งทั้ง TutorialID และ TutorialName ไปยังเมธอดนี้
  2. ในขั้นตอนที่สอง เรากำลังเรียกใช้เมธอด SetTutorial ด้วยพารามิเตอร์เพียงตัวเดียว เราแค่ส่ง TutorialName ไปยังวิธีนี้

หากป้อนรหัสข้างต้นอย่างถูกต้องและรันโปรแกรม ผลลัพธ์ต่อไปนี้จะปรากฏขึ้น หากคุณต้องการดึงรหัสบทช่วยสอนพร้อมกับชื่อบทช่วยสอนด้วย คุณควรทำตามขั้นตอนด้านล่าง

  1. สร้างวิธีการแยกต่างหากที่เรียกว่า public int GetTutorialID
  2. ในวิธีการนั้นให้เขียนโค้ดบรรทัด “return TutorialID” สามารถใช้เพื่อส่งคืน TutorialID ไปยังโปรแกรมที่เรียกได้

Output:

ตัวอย่างความหลากหลาย C#

จากผลลัพธ์ เราจะเห็นได้อย่างชัดเจนว่าทั้งสองวิธีถูกเรียกสำเร็จแล้ว ด้วยเหตุนี้ สตริง "การฝึกสอนครั้งแรก" และ "การฝึกสอนครั้งที่สอง" จึงถูกส่งไปยังคอนโซล

คำถามที่พบบ่อย

C# รองรับการสืบทอดแบบเดี่ยว หลายระดับ และแบบลำดับชั้นผ่านทางคลาส ส่วนการสืบทอดแบบหลายทางนั้นทำได้เฉพาะผ่านทางอินเทอร์เฟซเท่านั้น

ไม่ คลาส AC# สืบทอดมาจากคลาสพื้นฐานเพียงคลาสเดียวเท่านั้น การสืบทอดแบบหลายทางจะใช้อินเทอร์เฟซหลายตัวแทน

การโอเวอร์โหลด (Overloading) ใช้ชื่อเดียวแต่มีพารามิเตอร์ต่างกันในขั้นตอนการคอมไพล์ ในขณะที่การโอเวอร์ไรด์ (Overriding) กำหนดนิยามใหม่ของเมธอดพื้นฐานเสมือน (virtual base method) ในขั้นตอนการรันไทม์

คีย์เวิร์ด virtual ทำให้เมธอดพื้นฐานสามารถเขียนทับได้ ส่วนคีย์เวิร์ด override จะกำหนดนิยามใหม่ของเมธอดนั้นในคลาสที่สืบทอดมา

คีย์เวิร์ด `base` ช่วยให้คลาสที่สืบทอดมาสามารถเรียกใช้คอนสตรัคเตอร์ของคลาสแม่ หรือเข้าถึงสมาชิกที่ซ่อนอยู่หรือถูกเขียนทับในคลาสพื้นฐานได้

กำหนดให้คลาสเป็นแบบ Sealed คลาสแบบ Sealed ไม่สามารถเป็นคลาสพื้นฐานได้ ซึ่งจะป้องกันการสืบทอดเพิ่มเติมและช่วยเพิ่มประสิทธิภาพ

ใช่แล้ว GitHub Copilot จะสร้างโครงสร้างคลาสพื้นฐานและคลาสย่อย และเพิ่มเมธอดเสมือนและเมธอดที่เขียนทับจากความคิดเห็นหรือชื่อคลาส

ML.NET กำหนดคลาสข้อมูลและคลาสการทำนายที่สืบทอดสมาชิกที่ใช้ร่วมกัน และไปป์ไลน์ของมันใช้ประเภทพื้นฐานของทรานส์ฟอร์เมอร์ทั่วไปซ้ำ

สรุปโพสต์นี้ด้วย: