Interface ใน C # คืออะไรพร้อมตัวอย่าง

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

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

  • 🔗 กับtract: อินเทอร์เฟซจะประกาศรูปแบบเมธอดและคุณสมบัติที่คลาสที่ใช้งานทุกคลาสต้องกำหนดขึ้น
  • ไม่มีการดำเนินการ: อินเทอร์เฟซจะเก็บเฉพาะการประกาศเท่านั้น ดังนั้นคลาสจะเป็นผู้เขียนโค้ดเมธอดจริง
  • 🔑 คำที่เกี่ยวข้อง: คีย์เวิร์ด interface ใช้สร้างประเภท และคลาสจะใช้เครื่องหมายโคลอนเพื่อใช้งานประเภทนั้น
  • 🔀 อินเทอร์เฟซหลายแบบ: คลาสหนึ่งสามารถใช้งานอินเทอร์เฟซได้หลายแบบ ทำให้ภาษา C# มีลักษณะของการสืบทอดแบบหลายทาง
  • อินเทอร์เฟซเทียบกับ ABStracคลาส t: อินเทอร์เฟซกำหนดพฤติกรรมเท่านั้น ในขณะที่ค่าสัมบูรณ์tracคลาส t ยังสามารถเก็บสถานะและโค้ดที่ใช้ร่วมกันได้อีกด้วย
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot สร้างโครงสร้างพื้นฐานของอินเทอร์เฟซและการใช้งาน และไปป์ไลน์ ML.NET อาศัยตัวแปลงแบบอิงตามอินเทอร์เฟซtracทีเอส

อินเทอร์เฟซในภาษา C#

ส่วนต่อประสานใน C # คืออะไร?

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

มาดูตัวอย่างอินเทอร์เฟซโดยการเปลี่ยนคลาสในแอปพลิเคชันคอนโซลของเรา โปรดทราบว่าเราจะไม่เรียกใช้โค้ดเนื่องจากไม่มีสิ่งใดที่สามารถเรียกใช้โดยใช้อินเทอร์เฟซได้

ตัวอย่างอินเทอร์เฟซ C#

มาสร้างคลาสอินเทอร์เฟซกันเถอะ คลาสนี้จะชื่อว่า “Guru99Interface” คลาสหลักของเราจะสืบทอดจากอินเทอร์เฟซที่กำหนดไว้ โค้ดทั้งหมดจะต้องเขียนในไฟล์ Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 interface IGuru99Interface
 {
  void SetTutorial(int pID, string pName);
  String GetTutorial();
 }

 class Guru99Tutorial : IGuru99Interface
 {
  protected int TutorialID;
  protected string TutorialName;

  public void SetTutorial(int pID, string pName)
  {
   TutorialID = pID;
   TutorialName = pName;
  }

  public String GetTutorial()
  {
   return TutorialName;
  }

  static void Main(string[] args)
  {
   Guru99Tutorial pTutor = new Guru99Tutorial();

   pTutor.SetTutorial(1,".Net by Guru99");

   Console.WriteLine(pTutor.GetTutorial());

   Console.ReadKey();
  }
 }
}

Code คำอธิบาย:-

ที่นี่ เราจะอธิบายส่วนสำคัญของโค้ด

ตัวอย่างอินเทอร์เฟซ C#

  1. ขั้นแรก เราจะกำหนดอินเทอร์เฟซที่เรียกว่า “Guru99อินเทอร์เฟซ” โปรดสังเกตว่าคำหลัก “อินเทอร์เฟซ” ใช้เพื่อกำหนดอินเทอร์เฟซ
  2. ต่อไป เราจะกำหนดวิธีการที่จะใช้กับอินเทอร์เฟซของเรา ในกรณีนี้ เราจะกำหนดวิธีการเดียวกันกับที่ใช้ในตัวอย่างก่อนหน้านี้ทั้งหมด โปรดทราบว่าอินเทอร์เฟซจะประกาศวิธีการเท่านั้น ไม่ได้กำหนดโค้ดในวิธีการเหล่านั้น
  3. จากนั้นเราจึงสร้างของเรา Guruคลาส 99Tutorial สืบทอดมาจากอินเทอร์เฟซ ตรงนี้คือส่วนที่เราเขียนโค้ดเพื่อกำหนดเมธอดต่างๆ ที่ประกาศไว้ในอินเทอร์เฟซ การเขียนโค้ดแบบนี้จะทำให้ได้ผลลัพธ์ดังต่อไปนี้
    • สิ่งนี้ทำให้มั่นใจได้ว่าชั้นเรียนนั้น Guru99Tutorial จะเพิ่มเฉพาะโค้ดที่จำเป็นสำหรับเมธอด "SetTutorial" และ "GetTutorial" เท่านั้น และไม่มีการเพิ่มโค้ดส่วนอื่นใด
    • นอกจากนี้ยังช่วยให้มั่นใจได้ว่าอินเทอร์เฟซจะทำงานเหมือนกับคอนโทรลtracที ชั้น ต้องปฏิบัติตามข้อตกลงtract. ดังนั้นถ้า contracถ้าบอกว่าควรมีสองเมธอดชื่อ “SetTutorial” และ “GetTutorial” ก็ควรจะเป็นแบบนั้น

C# Interface เทียบกับ Abstracคลาส t

คำถามทั่วไปสำหรับผู้เริ่มต้นคือ อินเทอร์เฟซของ C# แตกต่างจากอย่างไร เอบีเอสtract-classทั้งสองนิยาม contracเช่นเดียวกับประเภทอื่นๆ แต่มีเป้าหมายการออกแบบที่แตกต่างกัน

ความแตกต่างที่สำคัญมีดังต่อไปนี้:

  • การดำเนินการ: อินเทอร์เฟซประกอบด้วยเฉพาะการประกาศ ในขณะที่ค่าสัมบูรณ์tracคลาส t สามารถให้ทั้ง abs ได้tracสมาชิก t และวิธีการที่ได้รับการดำเนินการอย่างสมบูรณ์
  • การสืบทอดทางกรรมพันธุ์หลายทาง: คลาสหนึ่งสามารถใช้งานอินเทอร์เฟซได้หลายแบบ แต่สามารถสืบทอดคุณสมบัติพื้นฐานได้เพียงหนึ่งเดียวเท่านั้นtracคลาส t
  • สถานะ: กล้ามท้องtracคลาสสามารถเก็บฟิลด์ ตัวสร้าง และคุณสมบัติที่มีข้อมูลได้ ในขณะที่อินเทอร์เฟซไม่สามารถเก็บสถานะของอินสแตนซ์ได้
  • ตัวแก้ไขการเข้าถึง: abstracสมาชิกของคลาส t สามารถเป็นสาธารณะ ป้องกัน หรือส่วนตัวได้ ในขณะที่สมาชิกของอินเทอร์เฟซแบบคลาสสิกจะเป็นสาธารณะโดยปริยาย
  • ใช้กรณี: ใช้อินเทอร์เฟซเพื่อเพิ่มความสามารถข้ามประเภทที่ไม่เกี่ยวข้องกัน และค่าสัมบูรณ์tracคลาส t ใช้สำหรับแบ่งปันโค้ดร่วมกันระหว่างประเภทที่เกี่ยวข้องอย่างใกล้ชิด

โดยสรุป อินเทอร์เฟซอธิบายว่าคลาสสามารถทำอะไรได้บ้าง ในขณะที่ค่าสัมบูรณ์tracคลาส t ยังสามารถกำหนดส่วนหนึ่งของวิธีการดำเนินการได้อีกด้วย

วิธีใช้งานอินเทอร์เฟซหลายตัวใน C#

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

ในการใช้งานอินเทอร์เฟซหลายรายการ ให้ระบุอินเทอร์เฟซเหล่านั้นต่อท้ายชื่อคลาส และคั่นแต่ละรายการด้วยเครื่องหมายจุลภาค จากนั้นคลาสจะต้องกำหนดเมธอดทุกเมธอดที่ประกาศไว้ในแต่ละอินเทอร์เฟซที่คลาสใช้งาน

ขั้นตอน 1) ประกาศอินเทอร์เฟซสองรายการ โดยแต่ละรายการมีเมธอดของตนเอง

ขั้นตอน 2) สร้างคลาสที่ใช้งานทั้งสองอินเทอร์เฟซ โดยคั่นชื่ออินเทอร์เฟซด้วยเครื่องหมายจุลภาค

ขั้นตอน 3) ระบุเนื้อหาเมธอดสำหรับสมาชิกทุกตัวที่ประกาศในแต่ละอินเทอร์เฟซ

ตัวอย่างด้านล่างแสดงคลาส Document ที่ใช้งานทั้ง IReadable และอินเทอร์เฟซ IWritable

using System;
namespace DemoApplication
{
 interface IReadable
 {
  void Read();
 }
 interface IWritable
 {
  void Write();
 }
 class Document : IReadable, IWritable
 {
  public void Read()
  {
   Console.WriteLine("Reading the document");
  }
  public void Write()
  {
   Console.WriteLine("Writing to the document");
  }
  static void Main(string[] args)
  {
   Document doc = new Document();
   doc.Read();
   doc.Write();
   Console.ReadKey();
  }
 }
}

Code คำอธิบาย:-

  1. เราประกาศอินเทอร์เฟซสองตัว คือ IReadable และ IWritable แต่ละอินเทอร์เฟซจะประกาศเมธอดเดียวโดยไม่มีเนื้อหาเมธอด
  2. คลาส Document แสดงรายการอินเทอร์เฟซทั้งสองหลังจากเครื่องหมายโคลอน โดยคั่นด้วยเครื่องหมายจุลภาค ดังนั้นจึงยอมรับการใช้งานอินเทอร์เฟซทั้งสองแบบtracทีเอส
  3. จากนั้นคลาสจะกำหนดเมธอด Read และ Write ข้ามไปping ไม่ว่าจะใช้วิธีใดก็จะทำให้เกิดข้อผิดพลาดขณะคอมไพล์
  4. เมธอด Main สร้างอ็อบเจ็กต์ Document และเรียกใช้ทั้งสองเมธอด ซึ่งเป็นการพิสูจน์ว่าคลาสนี้ตรงตามข้อกำหนดของอินเทอร์เฟซทั้งสอง

เมื่อโปรแกรมทำงาน มันจะพิมพ์... การอ่านเอกสาร ในบรรทัดแรกและ การเขียนเอกสาร ในบรรทัดที่สอง รูปแบบนี้ทำให้แต่ละคอนtracมีขนาดเล็กและเน้นเฉพาะจุด ทำให้คลาส Document ทดสอบและขยายได้ง่ายขึ้น

ข้อดีของการใช้อินเทอร์เฟซใน C#

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

ข้อดีหลัก ได้แก่ :

  • ข้อต่อหลวม: Code ขึ้นอยู่กับอินเทอร์เฟซ ไม่ใช่คลาสเฉพาะ ดังนั้นการใช้งานจึงสามารถเปลี่ยนแปลงได้โดยไม่ทำให้ผู้เรียกใช้งานเสียหาย
  • การสืบทอดทางกรรมพันธุ์หลายทาง: คลาสสามารถสืบทอดพฤติกรรมจากอินเทอร์เฟซหลายๆ ตัวได้ ซึ่งการสืบทอดคลาสแบบธรรมดาไม่สามารถทำได้
  • ความสามารถในการทดสอบ: อินเทอร์เฟซช่วยให้การเปลี่ยนคลาสจริงเป็นอ็อบเจ็กต์จำลองระหว่างการทดสอบหน่วยทำได้ง่ายขึ้น
  • การฉีดพึ่งพา: เฟรมเวิร์กจะแทรกการใช้งานอินเทอร์เฟซในระหว่างการทำงาน ซึ่งเป็นแนวคิดหลักเบื้องหลังหลักการ SOLID
  • สอดคล้อง: คลาสที่ใช้งานทุกคลาสจะต้องมีชุดสมาชิกเดียวกัน ซึ่งทำให้ API สามารถคาดเดาได้

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

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

ตามธรรมเนียมแล้ว ชื่ออินเทอร์เฟซในภาษา C# จะขึ้นต้นด้วยตัวอักษร I ตัวใหญ่ เช่น IDisposable หรือ IReadableคำนำหน้า "I" บ่งบอกทันทีว่าประเภทนั้นเป็นอินเทอร์เฟซ ไม่ใช่คลาสหรือโครงสร้าง

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

การใช้งานแบบระบุชัดเจนจะตั้งชื่อสมาชิกโดยใช้คำนำหน้าอินเทอร์เฟซ เช่น IReadableอ่าน. จากนั้นสมาชิกจะสามารถเรียกใช้งานได้ผ่านการอ้างอิงอินเทอร์เฟซเท่านั้น ซึ่งจะช่วยหลีกเลี่ยงปัญหาการชนกันของชื่อเมื่ออินเทอร์เฟซสองตัวประกาศเมธอดเดียวกัน

ใช่แล้ว อินเทอร์เฟซสามารถสืบทอดจากอินเทอร์เฟซอื่นได้หนึ่งอินเทอร์เฟซหรือมากกว่านั้น คลาสที่ใช้งานอินเทอร์เฟซลูกจะต้องกำหนดเมธอดทุกเมธอดจากทั้งอินเทอร์เฟซลูกและอินเทอร์เฟซแม่ที่สืบทอดมาทั้งหมด

ไม่ อินเทอร์เฟซไม่สามารถสร้างอินสแตนซ์โดยตรงได้ เนื่องจากไม่มีการใช้งานจริง คุณต้องสร้างอ็อบเจ็กต์ของคลาสที่ใช้งานอินเทอร์เฟซนั้นก่อน จากนั้นจึงอ้างอิงถึงอ็อบเจ็กต์นั้นผ่านทางประเภทของอินเทอร์เฟซ

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

ใช่แล้ว GitHub Copilot สามารถสร้างโครงสร้างพื้นฐานของอินเทอร์เฟซ แนะนำลายเซ็นเมธอด และสร้างคลาสที่ใช้งานอินเทอร์เฟซนั้นได้จากเพียงแค่คำอธิบายสั้นๆ หรือชื่อของอินเทอร์เฟซ ซึ่งจะช่วยเร่งความเร็วในการพัฒนาtracการพัฒนาแบบ t-first

ML.NET อาศัยอินเทอร์เฟซต่างๆ เช่น ITransformer และ IDataView ในการกำหนดไปป์ไลน์การเรียนรู้ของเครื่อง การเขียนโค้ดโดยใช้อินเทอร์เฟซเหล่านี้มีข้อจำกัดtracts ช่วยให้คุณสามารถสลับโมเดลและแหล่งข้อมูลได้โดยไม่ต้องเขียนโค้ดการฝึกอบรมโดยรอบใหม่

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