الاثنين، 29 سبتمبر 2014

تعلم AS3 - جزء2 [ OOP ] - الدرس 4 [التوريث inheritance]

السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت3




في هذا الدرس سنرى مفهوما جديدا و مهما في البرمجة الكائنية و هو التوريث

__________________

كلمة توريث مأخوذة من العالم الحي 
كل عنصر في العالم يأخذ خصائص عنصر اخر 
مثلا الانسان له الكثير من خصائص الثدييات (الانسان يرث من الثدييات)
الموز له خصائص  الفواكه (الموز يرث من الفواكه تلك الخصائص)

يُستعمل التوريث في العلاقات من نوع "is a" أي "هو.."
مثلا في لعبة ما لدينا الاعبون العاديون(player) و المشرفون على اللعبة(admin)
المشرفون  'هم لاعبون'  (فهم يملكون نفس الخصائص) 

المشرف يرث كل خصائص الاعب العادي
الكلاس player تدعى الكلاس الأم أو سوبر كلاس (super class)
و الكلاس admin تدعى الكلاس البنت (sub-class)

_______________________

الوراثة في الأكشن سكربت 3 :


لكي ترث كلاس نفس خصائص كلاس اخر نستعمل الكلمة الدلالية
extends



مثال الكلاس admin ترث من الكلاس player


package
{
         public class admin extends player
        {
               public function admin()
             {
                      // constructor code
             }
        }
}

الان لكي ننشئ instance للكلاس admin نستعمل نفس الطريقة السابقة  نذهب الى timeline و نكتب الكود

var myAdmin : admin = new admin();


اذا جربنا هذا الكود ستظهر لنا  رسالة خطأ 1203

عندما ترث كلاس بنت من كلاس أم 
يجب علينا أن نمرّ على ال constructor الخاص بالأم مع احترام المداخل الخاص به

لكي ندخل الى constructor الخاص بالأم نستعمل الكلمة super


السلام عليكم و رحمة الله
مرحبا بكم في درس جديد من دورة تعلم الاكشن سكربت3




في هذا الدرس سنرى مفهوما جديدا و مهما في البرمجة الكائنية و هو التوريث

__________________

كلمة توريث مأخوذة من العالم الحي 
كل عنصر في العالم يأخذ خصائص عنصر اخر 
مثلا الانسان له الكثير من خصائص الثدييات (الانسان يرث من الثدييات)
الموز له خصائص  الفواكه (الموز يرث من الفواكه تلك الخصائص)

يُستعمل التوريث في العلاقات من نوع "is a" أي "هو.."
مثلا في لعبة ما لدينا الاعبون العاديون(player) و المشرفون على اللعبة(admin)
المشرفون  'هم لاعبون'  (فهم يملكون نفس الخصائص) 

المشرف يرث كل خصائص الاعب العادي
الكلاس player تدعى الكلاس الأم أو سوبر كلاس (super class)
و الكلاس admin تدعى الكلاس البنت (sub-class)

_______________________

التوريث في الأكشن سكربت 3 :


لكي ترث كلاس نفس خصائص كلاس اخر نستعمل الكلمة الدلالية
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):void
public 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

العكس غير صحيح 
var myAdmin : admin = new player();


_________________________

ما الفائدة من تمرير متغير 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

الكلاس 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

override public function introduceMySelf():void
{
      super.introduceMySelf();  // الدخول الى الدالة الام و التي تظهر اسم الاعب
      trace("I'm admin!");
}



نلتقي  في الدرس القادم ان شاء الله

ليست هناك تعليقات:

إرسال تعليق


جميع الحقوق محفوظة لمدونة 2014-2015 as3arabic |