الطبقة الداخلية
في البرمجة الكائنية التوجه (OOP)، تُعرَّف الفئة الداخلية أو الفئة المتداخلة بأنها فئة مُعلنة بالكامل داخل جسم فئة أو واجهة أخرى. وهي تختلف عن الفئة الفرعية ، المشتقة من فئة أخرى.
ملخص
يمكن أن يوجد مثيل لفئة عادية أو فئة رئيسية بشكل مستقل. في المقابل، لا يمكن إنشاء مثيل لفئة داخلية دون ربطه بفئة رئيسية.
لنأخذ المفهوم المجرد لـ a Carبأربعة Wheelعناصر s. Wheelتتميز عناصرنا s بخاصية محددة تعتمد على كونها جزءًا من a Car. لا يُمثل هذا المفهوم العناصر Wheels Wheelكعناصر عامة يمكن أن تكون جزءًا من أي مركبة، بل يُمثلها كعناصر خاصة بـ a Car. يمكننا نمذجة هذا المفهوم باستخدام فئات داخلية كما يلي:
لدينا الفئة الرئيسية Car. Carتتكون كل نسخة من هذه الفئة من أربع نسخ من الفئة Wheel. هذا التطبيق الخاص Wheelللفئة مخصص لسيارة، لذا لا يُمثل الكود المفهوم العام للعجلة الذي يُفضل تمثيله كفئة رئيسية. لذلك، فهو مرتبط دلاليًا بالفئة، ويرتبط Carكود هذه الفئة Wheelبطريقة ما بفئتها الخارجية، كونه وحدة تركيبية للسيارة. عجلة السيارة فريدة من نوعها، ولكن لأغراض التعميم، تُعد العجلة وحدة تجميعية للسيارة.
تُوفّر الفئات الداخلية آليةً لنمذجة هذا الارتباط بدقة. يُمكننا الإشارة إلى Wheelفئتنا بـ Car.Wheel، Carحيث تُمثّل الفئة العليا، بينما Wheelتُمثّل الفئة الداخلية.
class Car { class Wheel { double diameter ; }int doors = 4 ; double maxSpeed ; Wheels [] wheels = new Wheels [ 4 ] ; }وبالتالي تسمح الفئات الداخلية بتوجه الكائنات لأجزاء معينة من البرنامج والتي لا يمكن تغليفها في فئة لولا ذلك.
قد يكون من الأفضل تصميم أو إعادة هيكلة أجزاء كبيرة من الكود داخل فئة ما كفئة رئيسية منفصلة، بدلاً من فئة داخلية. سيجعل هذا الكود أكثر عمومية في تطبيقه، وبالتالي أكثر قابلية لإعادة الاستخدام، ولكنه قد يكون تعميمًا سابقًا لأوانه. قد يكون هذا أكثر فعالية إذا كان الكود يحتوي على العديد من الفئات الداخلية ذات الوظائف المشتركة.
أنواع الفئات المتداخلة في جافا
في لغة جافا، توجد أربعة أنواع من الفئات المتداخلة :
- ثابت
- الفئات العضوية الثابتة، وتُسمى أيضًا الفئات المتداخلة الثابتة [ 1 ] - يتم تعريفها . ومثل غيرها من العناصر في النطاق الثابت (مثل الدوال الثابتة )، ليس لها مثيل مُغلِّف، ولا يمكنها الوصول إلى متغيرات ودوال مثيل الفئة المُغلِّفة. وهي تكاد تكون مُطابقة للفئات غير المتداخلة باستثناء تفاصيل النطاق (إذ يُمكنها الإشارة إلى المتغيرات والدوال الثابتة للفئة المُغلِّفة دون تحديد اسمها؛ أما الفئات الأخرى التي ليست من الفئات المُغلِّفة، فيجب تحديد اسمها باسم الفئة المُغلِّفة). الواجهات المتداخلة ثابتة ضمنيًا.
static
- الفئات غير الثابتة / الفئات الداخلية
الفئات الداخلية - تُسمى الفئات التالية بالفئات الداخلية . لكل نسخة من هذه الفئات مرجع إلى نسخة مُغلِّفة (أي نسخة من الفئة المُغلِّفة)، باستثناء الفئات المحلية والمجهولة المُعلنة في سياق ثابت. وبالتالي، يمكنها الإشارة ضمنيًا إلى متغيرات وأساليب النسخة الخاصة بالفئة المُغلِّفة. يمكن الحصول على مرجع النسخة المُغلِّفة صراحةً عبر . لا يجوز أن تحتوي الفئات الداخلية على متغيرات أو أساليب ثابتة، باستثناء المتغيرات الثابتة في وقت الترجمة. عند إنشائها، يجب أن يكون لها مرجع إلى نسخة من الفئة المُغلِّفة؛ مما يعني أنه يجب إنشاؤها إما داخل أسلوب نسخة أو مُنشئ للفئة المُغلِّفة، أو (بالنسبة للفئات الأعضاء والمجهولة) باستخدام الصيغة . [ 1 ] EnclosingClassName.thisenclosingInstance.new InnerClass()
- الفئة العضو - يتم تعريفها خارج الدالة (ومن هنا جاء مصطلح "عضو") وليس تعريفها .
static - الأصناف المحلية – هي أصناف تُصرَّح عنها داخل جسم الدالة. ولا يُمكن الرجوع إليها إلا في باقي أجزاء الدالة. يُمكنها استخدام المتغيرات المحلية ومعاملات الدالة، ولكن فقط تلك المُصرَّح عنها . (وذلك لأن نسخة الصنف المحلي يجب أن تحتفظ بنسخة منفصلة من المتغير، إذ قد يستمر وجودها بعد انتهاء الدالة؛ ولتجنب الالتباس الناتج عن وجود متغيرين قابلين للتعديل بنفس الاسم في نفس النطاق، يُجبر المتغير على أن يكون غير قابل للتعديل). يُمكن أن تكون هذه الأصناف مفيدة جدًا لإنشاء صنف ذي حقول من أنواع عامة، حيث تُعرَّف متغيرات النوع داخل الدالة.
final - الأصناف المجهولة – هي أصناف محلية تُعلن وتُنشأ تلقائيًا ضمن تعبير برمجي. يمكنها أن ترث مباشرةً من صنف واحد أو أن تُنفذ واجهة واحدة فقط. يمكنها تحديد وسائط لمنشئ الصنف الأصلي، ولكن لا يمكن أن تحتوي على منشئ خاص بها (مع ذلك، لا يُعد هذا قيدًا، إذ يمكن أن تحتوي على كتلة تهيئة للمثيل لإجراء أي عملية تهيئة).
لغات البرمجة
- أصبحت الفئات الداخلية ميزة من ميزات لغة برمجة جافا بدءًا من الإصدار 1.1.
- تُعد الفئات المتداخلة أيضًا ميزة في لغة البرمجة D ، و Visual Basic .NET ، وRuby ، و C++ ، و C# .
- في لغة بايثون ، من الممكن تضمين فئة داخل فئة أو طريقة أو دالة أخرى.
- تحتوي لغة C++ على فئات متداخلة تشبه فئات الأعضاء الثابتة في Java، باستثناء أنها لا يتم تعريفها باستخدام "static".
- أدخلت لغة بيتا مفهوم الفئات المتداخلة.
- في لغة C ، من القانوني تعريف بنية مجهولة داخل بنية أخرى، ولكن لا يمكن تسميتها، حيث لا يوجد مفهوم للأنواع المتداخلة (على عكس لغة C++ حيث يكون تداخل البنى المسماة قانونيًا).
كود واجهة المستخدم الرسومية
تُستخدم الفئات الداخلية المحلية غالبًا في جافا لتعريف دوال رد الاتصال لرمز واجهة المستخدم الرسومية. ويمكن للمكونات بعد ذلك مشاركة كائن يُنفذ واجهة معالجة الأحداث أو يمتد من فئة محول مجردة، تحتوي على التعليمات البرمجية التي سيتم تنفيذها عند تشغيل حدث معين.
تُستخدم الفئات الداخلية المجهولة أيضًا عندما يتم استخدام رمز معالجة الأحداث بواسطة مكون واحد فقط، وبالتالي لا يحتاج إلى مرجع مسمى.
يتجنب هذا الأسلوب استخدام دالة ضخمة ومعقدة actionPerformed(ActionEvent)ذات فروع متعددة من نوع if-else لتحديد مصدر الحدث. غالبًا ما يُعتبر هذا النوع من التعليمات البرمجية معقدًا ، وتُعتبر الاختلافات بين الفئات الداخلية أفضل من جميع النواحي.
مراجع
- 1 2 (Oracle) Nested Classes , Oracle.Com – The Java Tutorials.
روابط خارجية
- " الطبقات الداخلية ، فما فائدة الطبقات الداخلية على أي حال؟"
- الفئات المتداخلة في لغة D
- لغة سي++
- جافا (لغة برمجة)
- لغة النمذجة الموحدة
