0Pricing
C# Academy · درس

الواجهات العامة

جرّد الأنواع

الواجهات العامة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما الواجهة العامة؟

تصرّح الواجهة العامة بمعلمات الأنواع بين قوسين زاويين بعد اسمها. ويختار المُنفذون الأنواع الفعلية، ثم تتكيف عقد الواجهة وفقًا لذلك.

تستخدمها مكتبة .NET في كل مكان، مثل IEnumerable<T> وIComparable<T>.

interface IRepository<T>
{
    void Add(T item);
    T Get(int id);
}

تطبيق واجهة عامة

يمكن للفئة تطبيق واجهة عامة من خلال تمرير وسيطة نوع فعلية. وتستخدم تواقيع الأساليب بعد ذلك النوع الفعلي.

ينتج عن ذلك عقد آمن من ناحية النوع وقابل لإعادة الاستخدام من دون عمليات تحويل.

using System.Collections.Generic;

class IntStore : IRepository<int>
{
    private readonly List<int> data = new();
    public void Add(int item) => data.Add(item);
    public int Get(int id) => data[id];
}

interface IRepository<T>
{
    void Add(T item);
    T Get(int id);
}

الإبقاء على المُنفذ عامًا

يمكن للفئة تطبيق واجهة عامة مع بقائها عامةً هي نفسها، وذلك بتمرير معلمة نوعها إلى الواجهة.

يحافظ ذلك على قابلية إعادة استخدام التطبيق مع أي نوع من العناصر.

using System.Collections.Generic;

class Store<T> : IRepository<T>
{
    private readonly List<T> data = new();
    public void Add(T item) => data.Add(item);
    public T Get(int id) => data[id];
}

interface IRepository<T> { void Add(T item); T Get(int id); }

استخدام IComparable<T> عمليًا

تُعد IComparable<T> واجهة عامة مضمنة. ويتيح تطبيقها لنوعكم تحديد كيفية ترتيب مثيلاته، مما يتيح الفرز.

يعيد الأسلوب CompareTo قيمة سالبة أو صفرًا أو قيمة موجبة.

class Money : IComparable<Money>
{
    public int Cents;
    public int CompareTo(Money? other)
        => Cents.CompareTo(other?.Cents ?? 0);
}

تطبيق IEnumerable<T>

تمثل IEnumerable<T> جوهر LINQ وforeach. ويمكن تكرار أي نوع يطبقها. وغالبًا ما تفوضون ذلك إلى مكرّر مجموعة داخلية.

تجعل أساليب المكررات التي تستخدم yield return هذا الأمر سهلًا.

using System.Collections;
using System.Collections.Generic;

class Bag<T> : IEnumerable<T>
{
    private readonly List<T> items = new();
    public void Add(T x) => items.Add(x);
    public IEnumerator<T> GetEnumerator() => items.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

واجهة عامة عملية

يعرّف هذا البرنامج الكامل IPrinter<T> عامةً، ويطبقها للسلاسل النصية، ثم يستخدمها.

تضمن الواجهة وجود أسلوب Print مهما كان النوع الفعلي.

using System;

interface IPrinter<T> { void Print(T value); }

class ConsolePrinter<T> : IPrinter<T>
{
    public void Print(T value) => Console.WriteLine(value);
}

class Program
{
    static void Main()
    {
        IPrinter<string> p = new ConsolePrinter<string>();
        p.Print("hello generics");
    }
}

التغاير مع out

تكون معلمة الواجهة العامة المعلّمة بـ out متغايرةً تغايرًا طرديًا؛ إذ تظهر في مواضع الإخراج فقط. ويتيح ذلك استخدام IEnumerable<Cat> حيث يُتوقع IEnumerable<Animal>.

يحافظ التغاير الطردي على توافق الإسناد على امتداد تسلسل الوراثة.

interface IProducer<out T>
{
    T Produce();
}

التغاير العكسي مع in

تكون المعلمة المعلّمة بـ in متغايرةً تغايرًا عكسيًا؛ إذ تظهر في مواضع الإدخال فقط. ويتيح ذلك استخدام IComparer<Animal> حيث تكون هناك حاجة إلى IComparer<Cat>.

يعكس التغاير العكسي اتجاه قابلية الإسناد بالنسبة إلى المستهلكين.

interface IConsumer<in T>
{
    void Consume(T item);
}

معلمات أنواع متعددة

يمكن للواجهات العامة أن تقبل أكثر من معلمة واحدة. ويُعدّ IDictionary<TKey, TValue> مثالًا مألوفًا يستخدم نوعًا منفصلًا للمفتاح ونوعًا للقيمة.

يمكن أن تكون كل معلمة غير متغايرة أو متغايرة أو متغايرة عكسيًا بشكل مستقل.

interface IMapper<TIn, TOut>
{
    TOut Map(TIn input);
}

البرمجة اعتمادًا على الواجهة

الاعتماد على واجهة عامة بدلًا من فئة ملموسة يجعل الشفرة مرنة. ويمكن تبديل التطبيقات من دون تغيير الشفرة المستدعية.

تقبل معلمات الأساليب المكتوبة كـ IEnumerable<T> القوائم والمصفوفات ونتائج الاستعلام على حد سواء.

using System.Collections.Generic;
using System.Linq;

int Total(IEnumerable<int> values) => values.Sum();

القيود باستخدام الواجهات العامة

تظهر الواجهات العامة كثيرًا بوصفها قيودًا. يتيح where T : IComparable<T> للأسلوب فرز مدخلاته أو مقارنتها.

يجمع هذا بين ميزتين من ميزات الأنواع العامة لإنشاء خوارزميات آمنة قابلة لإعادة الاستخدام.

T Min<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) <= 0 ? a : b;

اختبار سريع

اختبروا مدى فهمكم للواجهات العامة.

مراجعة

تعلن الواجهات العامة عن معلمات الأنواع، وتتيح للأنواع المنفِّذة تثبيتها أو تمريرها. ومن أمثلتها المضمَّنة IEnumerable<T> وIComparable<T> وIDictionary<TKey, TValue>.

تتيح تعليقات التباين out وin التغاير والتغاير العكسي، كما تتكامل الواجهات العامة طبيعيًا مع قيود where.

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

هل درس «الواجهات العامة» مجاني؟

نعم — نص درس «الواجهات العامة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «الواجهات العامة»؟

جرّد الأنواع تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الواجهات العامة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. الأساليب العامة
  2. الفئات العامة
  3. قيود where
  4. الواجهات العامة
← العودة إلى C# Academy