Polymorphism, Nested Classes & Static Class Members
Polymorphism: وهو أن ينتمي object لclasses مختلفين.
هذا ما يحدث عندما يكون الsuper من نوع abstract, وهذا يعني أن الsuper يحتوي على الأقل إقتران واحد من نوع abstract. في هذه الحالة, عادة يكون هناك أكثر من class يرثون من هذا الsuper.
لأننا لا نستطيع أن نُعلن عن object من abstract class, فإنه لا بد من إستخدام الpolymorphism.
الصيغة العامة للإعلان عن object بإستخدام الpolymorphism:
super_class object_name=new sub_class (parameter_list);
بحيث أن:
super_class: هو إسم الsuper class
object_name: هو إسم الobject المُعلن عنه
sub_class: هو إسم الsub class
parameter_list: هي القيم التي يتم تمريرها والتي تُحدد للمُحول البرمجي (compiler) أي constructor يجب عليه أن ينفذ من الموجودين داخل الsub class
الobject المُعلن عنه سيكون من الsub class وذلك لأن الsuper class من نوع abstract في حال إستخدام الpolymorphism.
المثال التالي يوضح مفهوم الpolymorphism:
الclass Vehicle:
Example (1):
الclass Car:
الclass Truck:
الclass MotorCycle:
الclass MyClass:
صندوق الناتج:
**************************************************
Nested Classes: وهو تعريف class داخل نطاق class ثاني.
Nested Classes: وهو تعريف class داخل نطاق class ثاني.
في هذه الحالة, يستطيع الclass الداخلي إستخدام كل من الكود الخاص به والكود الخاص بالclass الخارجي.
تبدو هذه العملية مثل الوراثة, بحيث أن class يمتد من class اخر (أي أن الclass الداخلي يستخدم الكود الخاص به والكود الخاص بالclass الخارجي أيضاً), ولكننا هنا لا نستخدم كلمة extends المحجوزة. لذلك فإن الإعلان عن object من الclass الداخلي لن يؤدي إلى إستدعاء الconstructor الإفتراضي للclass الخارجي.
المثال التالي يوضح مفهوم الnested classes:
تبدو هذه العملية مثل الوراثة, بحيث أن class يمتد من class اخر (أي أن الclass الداخلي يستخدم الكود الخاص به والكود الخاص بالclass الخارجي أيضاً), ولكننا هنا لا نستخدم كلمة extends المحجوزة. لذلك فإن الإعلان عن object من الclass الداخلي لن يؤدي إلى إستدعاء الconstructor الإفتراضي للclass الخارجي.
المثال التالي يوضح مفهوم الnested classes:
Example (2):
الclass Class1:
الclass MyClass:
صندوق الناتج:
ملاحظة: لا حاجة لتعريف متغيرات الclass الخارجي من نوع protected أو public لكي تكون مُتاحة للclass الداخلي لأن هذه العملية ليست وراثة.
ملاحظة: لا تستطيع الإعلان عن object من الclass الداخلي خارج نطاق الclass الخارجي.
لذلك, فإن الإقتران main لا يستطيع التعامل بشكل مُباشر مع الClass2.
**************************************************
Static Data Members: وهي عناصر الclass (المُتغيرات والإقترانات) التي يتم الإعلان عنها بكلمة static المحجوزة.
العناصر الstatic تكون موجودة وقابلة للإستخدام مباشرة حتى وإنت لم يتم الإعلان عن object من الclass, مما يعني أنك تستطيع الوصول إلى هذه العناصر والتعامل معها مباشرة وذلك من خلال إسم الclass الذي يحتويها (مثلاً:
.(Class1.y=5;
من المعلوم أن كل object هو نسخة مُنفصلة من الclass, ولكن العناصر الstatic تكون نسخة موحدة لجميع الobjects, وهذا معناه أن أي تغيير على قيمة متغير static داخل object سيؤثر على قيمة هذا المتغير داخل جميع الobjects.
هناك بعض الأمور التي تحُد من فعالية إستخدام العناصر الstatic:
1- تستطيع الإقترانات الstatic إستخدام العناصر الstatic فقط. بينما يستطيع الإقتران العادي أن يتعامل مع جميع العناصر.
2- لا تستطيع الإقترانات الstatic إستخدام كلمتي this وsuper المحجوزتين.
3- المُتغيرات الstatic هي "مُتغيرات وحيدة النُسخة", مما يعني أن هناك نسخة واحدة فقط موجودة من المتغير الstatic لجميع الobjects.
المثالين التاليين يوضحان مفهوم الstatic data members:
Example (3):
الclass Class1:
الclass Class1Test:
صندوق الناتج:
لاحظ أن المُتغير y مُشترك لجميع الobjects.
الإقتران print أيضاً static, لذلك لا يستطيع التعامل إلا مع العناصر الstatic.
Example (4):
الclass Class1:
الclass Class2:
الclass MyClass:
صندوق الناتج:
**************************************************
للحصول على نُسخ نصية من كودات البرامج الأربعة السابقة:
الArrays والArrayList والStrings ستتم مناقشتها في الدرس القادم بإذن الله ...
سامر المناصرة
ليست هناك تعليقات:
إرسال تعليق