السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت3
في هذا الدرس سنرى مفهوما جديدا و مهما في البرمجة الكائنية و هو التوريث
__________________
كلمة توريث مأخوذة من العالم الحي
كل عنصر في العالم يأخذ خصائص عنصر اخر
مثلا الانسان له الكثير من خصائص الثدييات (الانسان يرث من الثدييات)
الموز له خصائص الفواكه (الموز يرث من الفواكه تلك الخصائص)
يُستعمل التوريث في العلاقات من نوع "is a" أي "هو.."
مثلا في لعبة ما لدينا الاعبون العاديون(player) و المشرفون على اللعبة(admin)
المشرفون 'هم لاعبون' (فهم يملكون نفس الخصائص)
المشرف يرث كل خصائص الاعب العادي
الكلاس player تدعى الكلاس الأم أو سوبر كلاس (super class)
و الكلاس admin تدعى الكلاس البنت (sub-class)
_______________________
لكي ترث كلاس نفس خصائص كلاس اخر نستعمل الكلمة الدلالية
extends
مثال الكلاس admin ترث من الكلاس player
package
{
public class admin extends player
{
public function admin()
{
// constructor code
}
}
}
الان لكي ننشئ instance للكلاس admin نستعمل نفس الطريقة السابقة نذهب الى timeline و نكتب الكود
var myAdmin : admin = new admin();
عندما ترث كلاس بنت من كلاس أم
يجب علينا أن نمرّ على ال constructor الخاص بالأم مع احترام المداخل الخاص به
السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت3
في هذا الدرس سنرى مفهوما جديدا و مهما في البرمجة الكائنية و هو التوريث
__________________
كلمة توريث مأخوذة من العالم الحي
كل عنصر في العالم يأخذ خصائص عنصر اخر
مثلا الانسان له الكثير من خصائص الثدييات (الانسان يرث من الثدييات)
الموز له خصائص الفواكه (الموز يرث من الفواكه تلك الخصائص)
يُستعمل التوريث في العلاقات من نوع "is a" أي "هو.."
مثلا في لعبة ما لدينا الاعبون العاديون(player) و المشرفون على اللعبة(admin)
المشرفون 'هم لاعبون' (فهم يملكون نفس الخصائص)
المشرف يرث كل خصائص الاعب العادي
الكلاس player تدعى الكلاس الأم أو سوبر كلاس (super class)
و الكلاس admin تدعى الكلاس البنت (sub-class)
_______________________
لكي ترث كلاس نفس خصائص كلاس اخر نستعمل الكلمة الدلالية
extends
مثال الكلاس admin ترث من الكلاس player
package
{
public class admin extends player
{
public function admin()
{
super();
}
}
}
________________________________________
فلنفرض ان في الكلاس player هذه المتغيرات
var playerName:String;
var xp:int;
var life:int;
و هذه الدوال
public function attack( p2:player):void
public function receive(xp:int):voidpublic function die():void
و أردنا انشاء نوع اخر من الاعبين بحيث تكون له نفس خصائص الاعب العادي و لكن اضافة الى هذا
يمكنه الاشراف عليهم
مثلا طرد الاعبين الغشاشين
حذف الاعب ..الخ
عوضا ان ننشئ كلاس admin نضع بداخلها المتغيرات
var playerName:String;
var xp:int;
var life:int;
و الدوال
public function attack( p2:player):void
public function receive(xp:int):void
public function die():void
يكفي أن نستعمل extends و ستأخذ الكلاس admin كل خصائص الكلاس player
________________________________________
مثال اخر
لدينا مجموعة حيوانات
كل حيوان له سرعة قصوى و صوت ...الخ
فلتكن تلك الحيوانات قط و كلب و أسد
عوضا أن ننشئ الكلاسات الثلاث و نكتب نفس المتغيرات و الدوال في كل كلاس مثلا
var maxSpeed
var sound
..
.function set MaxSpeed(s:int):void
function get MaxSpeed():int
....
يكفي انشاء كلاس animal و وضع كل الخصائص
ثم نستعمل extends لكي ترث باقي الكلاسات منها
public class lion extends animal
public class dog extends animal
..
_____________________________________________________________________
: super-types / sub-types
بفضل التوريث الكلاس admin تملك نوعين
player : يعتبر super-type
admin: يعتبر sub-type
لو نكتب الكود التالي
var myAdmin : admin = new admin();
trace(myAdmin is admin); //true
trace(myAdmin is player); //true
سيظهر لنا true و هذا يعني أن myAdmin هو admin و player
كلما قمنا بتوسيع ال super type (توسيع يعني هناك كلاسات ترث منه)
يمكننا تمرير instance من sub-type
يعني المتغيرات من نوع player يمكنها تخزين كائنات من نوع admin
مثال
var myAdmin : player = new admin();
trace(myAdmin is admin); //true
trace(myAdmin is player); //true
كل admin هو player
المترجم يعلم ان كل الخصائص الموجودة في player هي موجودة أيضا في admin
العكس غير صحيح
_________________________
ما الفائدة من تمرير متغير sub type الى متغير super type؟
فلنفرض أننا نملك دالة ترجع لنا أنواع مختلفة من الكائنات
مثلا
getBestPlayer():player
هذه الدالة مثلا ترجع لنا أقوى لاعب في اللعبة من نوع player
لكن قد يكون أقوى لاعب من نوع admin أو نوع اخر
يمكننا و بدون أي مشكل ارجاع أحسن لاعب مهما كان نوعه player او admin
return (admin_type);
مثال اخر
هذه الدالة موجودة داخل الفلاش بحيث سترجع لنا كل انواع الكائنات الجرافيكية (سنراها في الاجزاء القادمة)
public function getChildAt(index:int):DisplayObject
هناك الكثير من المتغيرات الجرافيكية مثل
shape MovieClip Sprite SimpleButton
كل هذه الانواع ترث من الكلاس DisplayObject و لهذا فإن تلك الدالة ترجع لنا مختلف الانواع الجرافيكية
______________
ماذا لو جربنا الكود التالي؟
نفرض أن في الكلاس admin الدالة التالية
banPlayer(p:player):void
الهدف منها طرد لاعب لسبب معين
هل هذا الكود صحيح؟
var playerHacker : player = new player();
var myAdmin : player = new admin();
myAdmin.banPlayer(playerHacker);
اذا جربنا هذا الكود سنقع في رسالة خطأ 1061
ليصبح الكود هكذا
admin( myAdmin ).banPlayer(playerHacker);
____________
اذا جربنا هذا الكود سنقع في رسالة خطأ 1061
الكلاس player لا تملك الدالة banPlayer بالرغم من أننا مررنا للمتغير myAdmin كائن من نوع admin
لكي نتمكل من تنفيذ الدالة banPlayer نستعمل نفس الطريقة التي رأيناها في درس المتغيرات (casting)
هكذا
type ( myObject)ليصبح الكود هكذا
var playerHacker : player = new player();
var myAdmin : player = new admin();
admin( myAdmin ).banPlayer(playerHacker);
هذه المفاهيم في البرمجة الكائنية تدعى Polymorphism
تعديل دالة موروثة (override) :
عندما نرث من كلاس معينة فاننا نرث كل المتغيرات و الدوال الخاص بالكلاس الأم
لكن أحيانا نحتاج الى تغيير دالة ما كإضافة بعض الاكواد مثلا
فلنفرض أن في الكلاس player لدينا دالة introduceMySelf
حيث سنظهر فيها اسم الاعب
public function introduceMySelf():void
{
trace("my name is :"+ this.playerName);
}
أنا في الكلاس admin عوضا أن أظهر اسم الاعب أريد أن أظهر رسالة i'm admin
override public function introduceMySelf():void
{
trace("I'm admin!");
}
ملاحظة مهمة:
الدالة المعدلة يجب أن تملك نفس اسم و المداخل و نوع ارجاع الدالة الام
عندما نعدل دالة ما فهذا لن يفقدنا الدالة الموروثة .يمكننا الدخول الى الدالة الام عن طريق الكلمة super
عندما نعدل دالة ما فهذا لن يفقدنا الدالة الموروثة .يمكننا الدخول الى الدالة الام عن طريق الكلمة super
override public function introduceMySelf():void
{
super.introduceMySelf(); // الدخول الى الدالة الام و التي تظهر اسم الاعب
super.introduceMySelf(); // الدخول الى الدالة الام و التي تظهر اسم الاعب
trace("I'm admin!");
}
نلتقي في الدرس القادم ان شاء الله
ليست هناك تعليقات:
إرسال تعليق