الوراثة في C#: كيفية استدعاء مُنشئ الفئة الأساسية (دليل كامل)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا مُنشئ الفئة الأساسية ليس مجرد "نظرية مملة"؟

\n\n

تخيل أنك تبني منزلاً. لديك أساس (الفئة الأساسية) والمنزل نفسه (الفئة المشتقة). الأساس قد تم وضعه بالفعل، ولكن لكي يكون المنزل قوياً، تحتاج إلى "ربطه" بشكل صحيح بالأساس. في C#، هذا "الربط" يتم عن طريق استدعاء مُنشئ الفئة الأساسية باستخدام الكلمة المفتاحية base.

\n\n

هذا أحد المواضيع التي تثير آلاف الأسئلة على Stack Overflow. لماذا؟ لأنه بدون فهم هذه الآلية، إما أن الكود الخاص بك لن يتم تجميعه، أو سيعمل بشكل غير متوقع. في هذه المقالة، سنشرح استدعاء مُنشئ الفئة الأساسية في C# من البسيط إلى المعقد: مع أمثلة، والمزالق، والسيناريوهات الواقعية.

\n\n

ماذا ستتعلم من هذه المقالة؟

\n
    \n
  • كيف تعمل وراثة المنشئات في C#.
  • \n
  • متى ولماذا تحتاج إلى استدعاء base() بشكل صريح.
  • \n
  • كيفية تمرير المعاملات إلى مُنشئ الفئة الأساسية.
  • \n
  • الأخطاء النموذجية وكيفية تجنبها.
  • \n
  • تقنيات متقدمة: سلاسل المنشئات والتحميل الزائد.
  • \n
\n\n

1. الأساسيات: ما هو مُنشئ الفئة الأساسية؟

\n\n

في C#، يمكن أن تحتوي كل فئة على مُنشئ واحد أو أكثر. عندما تقوم بإنشاء مثيل لفئة مشتقة، يتم أولاً استدعاء مُنشئ الفئة الأساسية. وهذا يضمن تهيئة جميع الحقول والخصائص "للأصل" قبل أن يبدأ "الفرع" في العمل.

\n\n

إذا لم تحدد بشكل صريح أي مُنشئ للفئة الأساسية يجب استدعاؤه، سيحاول المترجم استدعاء المُنشئ الافتراضي (بدون معاملات). إذا لم يكن موجوداً، فستتلقى خطأ في التجميع.

\n\n

مثال 1: استدعاء ضمني (كل شيء بسيط)

\n
public class Animal\n{\n    public string Name { get; set; }\n\n    public Animal()\n    {\n        Name = "حيوان غير معروف";\n        Console.WriteLine("Animal: منشئ بدون معاملات");\n    }\n}\n\npublic class Dog : Animal\n{\n    public Dog()\n    {\n        Console.WriteLine("Dog: منشئ");\n    }\n}\n\n// الاستخدام\nDog dog = new Dog();\n// الإخراج:\n// Animal: منشئ بدون معاملات\n// Dog: منشئ
\n\n

هنا، Dog يستدعي ضمنياً Animal(). كل شيء يعمل لأن Animal لديه مُنشئ افتراضي.

\n\n

2. المشكلة: عندما لا يوجد مُنشئ افتراضي

\n\n

والآن تخيل أن الفئة الأساسية تتطلب معاملات إلزامية. على سبيل المثال، يجب أن يكون للحيوان اسم. إذا قمت بإزالة المُنشئ بدون معاملات، سيتوقف الكود عن التجميع.

\n\n

مثال 2: خطأ في التجميع

\n
public class Animal\n{\n    public string Name { get; }\n\n    public Animal(string name) // المُنشئ الوحيد\n    {\n        Name = name;\n    }\n}\n\npublic class Dog : Animal\n{\n    // خطأ CS7036: "Animal" لا يحتوي على مُنشئ يقبل 0 وسيطات\n    public Dog() \n    {\n    }\n}
\n\n

المترجم يصرخ: "مرحباً، لا أعرف كيف أهيئ Animal بدون اسم!". الحل هو استدعاء مُنشئ الفئة الأساسية بشكل صريح باستخدام base.

\n\n

3. الكلمة المفتاحية base: الاستدعاء الصريح للمُنشئ

\n\n

تُستخدم الكلمة المفتاحية base في C# للوصول إلى أعضاء الفئة الأساسية. في سياق المنشئات، تسمح لك بتحديد أي مُنشئ للأصل يجب استدعاؤه وبأي وسائط.

\n\n

الصيغة:

\n
public class الفئةالمشتقة : الفئةالأساسية\n{\n    public الفئةالمشتقة(معاملات) : base(وسائط)\n    {\n        // جسم المُنشئ\n    }\n}
\n\n

يتم وضع النقطتين و base(وسائط) مباشرة بعد توقيع المُنشئ، قبل الجسم.

\n\n

مثال 3: إصلاح الخطأ

\n
public class Animal\n{\n    public string Name { get; }\n\n    public Animal(string name)\n    {\n        Name = name;\n        Console.WriteLine($"Animal: تم إنشاء {name}");\n                

المدونات

توصيات الكتب