مقدمة: لماذا مُنشئ الفئة الأساسية ليس مجرد "نظرية مملة"؟
\n\nتخيل أنك تبني منزلاً. لديك أساس (الفئة الأساسية) والمنزل نفسه (الفئة المشتقة). الأساس قد تم وضعه بالفعل، ولكن لكي يكون المنزل قوياً، تحتاج إلى "ربطه" بشكل صحيح بالأساس. في C#، هذا "الربط" يتم عن طريق استدعاء مُنشئ الفئة الأساسية باستخدام الكلمة المفتاحية base.
هذا أحد المواضيع التي تثير آلاف الأسئلة على Stack Overflow. لماذا؟ لأنه بدون فهم هذه الآلية، إما أن الكود الخاص بك لن يتم تجميعه، أو سيعمل بشكل غير متوقع. في هذه المقالة، سنشرح استدعاء مُنشئ الفئة الأساسية في C# من البسيط إلى المعقد: مع أمثلة، والمزالق، والسيناريوهات الواقعية.
\n\nماذا ستتعلم من هذه المقالة؟
\n- \n
- كيف تعمل وراثة المنشئات في C#. \n
- متى ولماذا تحتاج إلى استدعاء
base()بشكل صريح. \n - كيفية تمرير المعاملات إلى مُنشئ الفئة الأساسية. \n
- الأخطاء النموذجية وكيفية تجنبها. \n
- تقنيات متقدمة: سلاسل المنشئات والتحميل الزائد. \n
1. الأساسيات: ما هو مُنشئ الفئة الأساسية؟
\n\nفي C#، يمكن أن تحتوي كل فئة على مُنشئ واحد أو أكثر. عندما تقوم بإنشاء مثيل لفئة مشتقة، يتم أولاً استدعاء مُنشئ الفئة الأساسية. وهذا يضمن تهيئة جميع الحقول والخصائص "للأصل" قبل أن يبدأ "الفرع" في العمل.
\n\nإذا لم تحدد بشكل صريح أي مُنشئ للفئة الأساسية يجب استدعاؤه، سيحاول المترجم استدعاء المُنشئ الافتراضي (بدون معاملات). إذا لم يكن موجوداً، فستتلقى خطأ في التجميع.
\n\nمثال 1: استدعاء ضمني (كل شيء بسيط)
\npublic 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 لديه مُنشئ افتراضي.
2. المشكلة: عندما لا يوجد مُنشئ افتراضي
\n\nوالآن تخيل أن الفئة الأساسية تتطلب معاملات إلزامية. على سبيل المثال، يجب أن يكون للحيوان اسم. إذا قمت بإزالة المُنشئ بدون معاملات، سيتوقف الكود عن التجميع.
\n\nمثال 2: خطأ في التجميع
\npublic 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.
3. الكلمة المفتاحية base: الاستدعاء الصريح للمُنشئ
\n\nتُستخدم الكلمة المفتاحية base في C# للوصول إلى أعضاء الفئة الأساسية. في سياق المنشئات، تسمح لك بتحديد أي مُنشئ للأصل يجب استدعاؤه وبأي وسائط.
الصيغة:
\npublic class الفئةالمشتقة : الفئةالأساسية\n{\n public الفئةالمشتقة(معاملات) : base(وسائط)\n {\n // جسم المُنشئ\n }\n}\n\nيتم وضع النقطتين و base(وسائط) مباشرة بعد توقيع المُنشئ، قبل الجسم.
مثال 3: إصلاح الخطأ
\npublic class Animal\n{\n public string Name { get; }\n\n public Animal(string name)\n {\n Name = name;\n Console.WriteLine($"Animal: تم إنشاء {name}");\n