0Pricing
C# Academy · درس

التعددية الشكلية والإرسال الديناميكي

افهم التعددية الشكلية: استدعِ الأعضاء virtual عبر مرجع أساسي، واستخدم مجموعات ذات نوع أساسي، وتجنّب إخفاء الأساليب، ونفّذ التحويلات بأمان عند الحاجة.

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

نظرة عامة على تعدد الأشكال

الهدف: استخدام نوع أساسي واحد والسماح للأنواع المشتقة بتخصيص السلوك.

  • مرجع إلى النوع الأساسي وكائن مشتق
  • virtual + override → التوزيع الديناميكي
  • مجموعات ذات نوع أساسي
  • تجنّب إخفاء الأساليب باستخدام new

أساسيات التوزيع الديناميكي

يستخدم استدعاء أسلوب virtual نوع الكائن في وقت التشغيل، وليس نوع المتغير في وقت الترجمة.

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

تعدد الأشكال في المجموعات

خزّن الأنواع المشتقة المختلفة في List<Base> واستدعِ الأعضاء الافتراضية بطريقة موحّدة.

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

الإخفاء مقابل إعادة التعريف

تجنّب إخفاء الأساليب باستخدام new. استخدم override لتعدد الأشكال الحقيقي؛ فعند الإخفاء يستدعي المرجع إلى النوع الأساسي إصدار النوع الأساسي.

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

التحويل الآمن (as + التحقق)

فضّل الاستدعاءات عبر النوع الأساسي أو virtual. وإذا اضطررت إلى استخدام أعضاء خاصة بالنوع المشتق، فأجرِ تحويلًا آمنًا (as + التحقق من null).

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

نصائح تعدد الأشكال

نصائح:

  • صمّم أولًا لاستدعاءات النوع الأساسي وvirtual.
  • استخدم override بدلًا من new لتغيير السلوك.
  • اجعل واجهات النوع الأساسي صغيرة ومستقرة.
  • استخدم التحويل نادرًا؛ وفضّل تعدد الأشكال أو الواجهات.

معنى التوزيع الديناميكي

تحقق سريع: ماذا يعني التوزيع الديناميكي في C#؟

مراجعة

مراجعة: يتيح تعدد الأشكال لوحدة استدعاء أساسية الوصول إلى سلوكيات مشتقة متعددة عبر virtual/override. استخدم مجموعات ذات نوع أساسي، وتجنّب الإخفاء باستخدام new، ولا تُجرِ التحويل إلا عند الضرورة.

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

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

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

ماذا ستتعلم في «التعددية الشكلية والإرسال الديناميكي»؟

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

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

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

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

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

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

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

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

  1. virtual وoverride وsealed؛ الفئات المجرّدة
  2. الواجهات (مقدمة) وتطبيق واجهات متعددة
  3. التعددية الشكلية والإرسال الديناميكي
← العودة إلى C# Academy