ما هي الواجهة في C# مع مثال

⚡ ملخص ذكي

تُعرّف الواجهة في لغة C#tracيحدد هذا الأمر الطرق والخصائص التي يجب على الفئة تنفيذها، دون تقديم الكود الفعلي. توفر الفئة المنفذة السلوك الملموس، مما يتيح الترابط المرن والوراثة المتعددة عبر أنواع غير مترابطة.

  • 🔗 معtract: تُعرّف الواجهة توقيعات الأساليب والخصائص التي يجب على كل فئة مُنفذة تحديدها.
  • ✅ لا يوجد تنفيذ: تحتوي الواجهة على التصريحات فقط، لذلك يقوم الصنف بكتابة رمز الأسلوب الفعلي.
  • 🔑 عدد القطع تقوم الكلمة المفتاحية interface بإنشاء النوع، ويستخدم الصنف نقطتين رأسيتين لتنفيذه.
  • 🔀 واجهات متعددة: يمكن لفئة واحدة أن تنفذ العديد من الواجهات، مما يمنح لغة C# شكلاً من أشكال الوراثة المتعددة.
  • ⚖ الواجهة مقابل المادة المطلقةtracالفئة t: تحدد الواجهات السلوك فقط، بينما المطلقtracيمكن لفئات t أيضًا الاحتفاظ بحالة مشتركة ورمز برمجي.
  • 🤖 مساعدة الذكاء الاصطناعي: يوفر GitHub Copilot واجهات وتطبيقات جاهزة، وتعتمد مسارات ML.NET على محولات قائمة على الواجهاتtracالخبر.

واجهة برمجة التطبيقات في لغة C#

ما هي الواجهة في C #؟

An السطح البيني في لغة C#، يتم استخدامها مع فئة لتعريف contracوهي اتفاقية تحدد ما ستقدمه الفئة للتطبيق. تحدد الواجهة العمليات التي يمكن للفئة تنفيذها، وتُعلن عن خصائصها وأساليبها. ويقع على عاتق الفئة تحديد وظيفة كل أسلوب بدقة.

دعونا نلقي نظرة على مثال للواجهة عن طريق تغيير الفئات في تطبيق وحدة التحكم الخاص بنا. لاحظ أننا لن نقوم بتشغيل الكود لأنه لا يوجد شيء يمكن تشغيله باستخدام الواجهة.

مثال على واجهة C#

لنقم بإنشاء فئة واجهة. سيتم تسمية الفئة "Guru"99Interface". سيقوم صنفنا الرئيسي بعد ذلك بتوسيع الواجهة المُعرّفة. يجب كتابة جميع التعليمات البرمجية في ملف 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. نقوم أولاً بتعريف واجهة تسمى "Guru99Interface." لاحظ أن الكلمة المفتاحية "interface" تُستخدم لتعريف واجهة.
  2. بعد ذلك، نقوم بتحديد الأساليب التي ستستخدمها واجهتنا. في هذه الحالة، نقوم بتحديد نفس الأساليب المستخدمة في جميع الأمثلة السابقة. لاحظ أن الواجهة تعلن فقط عن الأساليب، ولا تحدد الكود الموجود فيها.
  3. ثم نقوم بعملنا Guruتُوسّع فئة 99Tutorial الواجهة. هنا نكتب الكود الذي يُعرّف الطرق المختلفة المُعلنة في الواجهة. يُحقق هذا النوع من البرمجة ما يلي:
    • يضمن ذلك أن الفصل الدراسي، Guruلا يضيف 99Tutorial سوى الكود الضروري لطرق "SetTutorial" و "GetTutorial" ولا شيء آخر.
    • كما يضمن ذلك أن تتصرف الواجهة مثل عملية احتيالtracر. ال فئة يجب عليه الالتزام بالعقدtracت. لذلك إذا كان المقنعtracإذا كان من المفترض أن يحتوي على طريقتين تسمى "SetTutorial" و "GetTutorial"، فهذا هو الوضع الصحيح.

واجهة C# مقابل Abstracفئة t

من الأسئلة الشائعة للمبتدئين: كيف تختلف واجهة C# عن... (ABS)tracفئة tكلاهما يُعرّفان عملية احتيالtracمع أن الأنواع الأخرى تتبعها، إلا أنها تخدم أهداف تصميم مختلفة.

فيما يلي أبرز الاختلافات:

  • التنفيذ: تحتوي الواجهة على التصريحات فقط، بينما تحتوي الواجهة المطلقة على التصريحات فقط.tracيمكن أن توفر الفئة t كلاً منtracأعضاء الفريق والأساليب المطبقة بالكامل.
  • الميراث المتعدد: يمكن للفئة أن تُنفذ العديد من الواجهات، ولكن لا يمكنها أن ترث إلا واجهة واحدة مطلقة.tracالفئة t.
  • المنطقة: عضلات بطنtracيمكن للفئة t أن تحتوي على الحقول والمنشئات والخصائص مع البيانات، بينما لا يمكن للواجهة تخزين حالة المثيل.
  • مُعدِّلات الوصول: ABStracيمكن أن تكون أعضاء الفئة t عامة أو محمية أو خاصة، بينما أعضاء الواجهة الكلاسيكية عامة ضمنيًا.
  • حالة الاستخدام: استخدم واجهة لإضافة إمكانية عبر أنواع غير مترابطة، وقيمة مطلقةtracفئة t لمشاركة التعليمات البرمجية المشتركة بين الأنواع ذات الصلة الوثيقة.

باختصار، تصف الواجهة ما يمكن أن يفعله الصنف، بينما يصف العنصر المطلقtracيمكن لفئة t أيضًا تحديد جزء من كيفية القيام بذلك.

كيفية تطبيق واجهات متعددة في لغة C#

على عكس وراثة الفئات، تسمح لغة C# لفئة واحدة بتنفيذ أكثر من واجهة. هكذا توفر اللغة شكلاً آمناً من الوراثة المتعددة دون الغموض الذي ينشأ عن وراثة عدة فئات أساسية في آن واحد.

لتطبيق عدة واجهات، اذكرها بعد اسم الصنف وافصل بينها بفاصلة. يجب على الصنف بعد ذلك تعريف كل دالة مُعلنة في كل واجهة يطبقها.

الخطوة 1) قم بتعريف واجهتين، لكل منهما طريقتها الخاصة.

الخطوة 2) أنشئ فئة تُنفذ كلا الواجهتين، مع فصل أسماء الواجهات بفاصلة.

الخطوة 3) قم بتوفير جسم دالة لكل عضو مُعلن عنه في كل واجهة.

يوضح المثال أدناه فئة المستند التي تنفذ كلاً من 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. تُدرج فئة المستند كلا الواجهتين بعد النقطتين، مفصولتين بفاصلة، لذا فهي توافق على احترام كليهماtracالخبر.
  3. ثم يُعرّف الصنف طريقتي القراءة والكتابة. تخطّيping كلا الطريقتين ستؤديان إلى حدوث خطأ أثناء الترجمة.
  4. تقوم الدالة الرئيسية بإنشاء كائن Document وتستدعي كلا الدالتين، مما يثبت أن الفئة تفي بالواجهتين.

عند تشغيل البرنامج، يقوم بطباعة قراءة الوثيقة في السطر الأول و الكتابة على المستند في السطر الثاني. يحافظ هذا النمط على كل اتصالtracصغيرة ومركزة، مما يجعل فئة المستند أسهل في الاختبار والتوسيع.

مزايا استخدام الواجهات في لغة C#

تُستخدم الواجهات على نطاق واسع في مشاريع C# الاحترافية لأنها تجعل الكود مرنًا وأسهل في الصيانة. فهي تتيح لك البرمجة وفقًا لـtracبدلاً من فئة محددة.

تشمل المزايا الرئيسية ما يلي:

  • اقتران فضفاض: Code يعتمد ذلك على الواجهة، وليس على فئة محددة، لذا يمكن تغيير التنفيذ دون تعطيل المتصلين.
  • الميراث المتعدد: يمكن للفئة أن ترث سلوكًا من عدة واجهات، وهو ما لا يسمح به التوريث البسيط للفئات.
  • قابلية الاختبار: تُسهّل الواجهات استبدال فئة حقيقية بكائن وهمي أثناء اختبار الوحدة.
  • حقن التبعية: تقوم الأطر البرمجية بإدخال تطبيق واجهة في وقت التشغيل، وهي فكرة أساسية وراء مبادئ SOLID.
  • الاتساق: يُجبر كل صنف تنفيذي على توفير نفس مجموعة الأعضاء، مما يحافظ على قابلية التنبؤ بواجهة برمجة التطبيقات.

وبسبب هذه المزايا، تُعتبر الواجهات في صميم معظم أنماط تصميم لغة C# الحديثة وأطر التطبيقات.

الأسئلة الشائعة

بحسب الاصطلاح، يبدأ اسم واجهة C# بالحرف I الكبير، مثل IDisposable أو IReadableيشير البادئة I على الفور إلى أن النوع عبارة عن واجهة وليس فئة أو بنية.

قبل الإصدار 8.0 من لغة C#، كانت الواجهة تحتوي فقط على تعريفات. أما بدءًا من الإصدار 8.0، فإن طرق الواجهة الافتراضية تسمح للواجهة بتوفير جسم الطريقة، لذا تستمر التطبيقات القديمة في العمل عند إضافة أعضاء جدد.

يُحدد التنفيذ الصريح اسم العضو باستخدام بادئة الواجهة الخاصة به، مثل IReadable.Read. يصبح العضو قابلاً للاستدعاء فقط من خلال مرجع واجهة، مما يتجنب تضارب الأسماء عندما تعلن واجهتان عن نفس الطريقة.

نعم. يمكن للواجهة أن ترث واجهة واحدة أو أكثر. يجب على الفئة التي تُنفذ واجهة فرعية أن تُعرّف كل طريقة من كل من الواجهة الفرعية وجميع الواجهات الأصلية الموروثة.

لا. لا يمكن إنشاء مثيل للواجهة مباشرةً لأنها لا تملك تطبيقًا. عليك إنشاء كائن من فئة تُطبّق الواجهة، ثم الإشارة إلى هذا الكائن من خلال نوع الواجهة.

نعم. عناصر الواجهة الكلاسيكية عامة ضمنيًا، ولا يمكنك إضافة مُعدِّلات وصول إليها. يجب على الفئة المُنفِّذة أيضًا تعريف العناصر المطابقة على أنها عامة.

نعم. يستطيع GitHub Copilot إنشاء واجهة، واقتراح توقيعات أساليبها، وإنشاء فئة تُنفذها من تعليق قصير أو اسم الواجهة، مما يُسرّع عملية الإنشاء.tracتطوير البرمجيات باستخدام منهجية t-first.

يعتمد ML.NET على واجهات مثل ITransformer و IDataView لتحديد مسار التعلم الآلي الخاص به. يتطلب البرمجة باستخدام هذه الواجهاتtracتتيح لك ts تبديل النماذج ومصادر البيانات دون إعادة كتابة كود التدريب المحيط.

تلخيص هذه التدوينة بـ: