الاثنين، 30 مايو 2011

مقالات : الوراثة في البرمجة






الوراثة Inheritance

بسم الله الرحمن الرحيم
في درس اليوم إن شاء الله سنتعرف على مفهوم هام وهو الوراثة Inheritance , لو تأملت المثال الموجود بالشكل التالي:
لو اعتبرت أن شركة NISSAN هي الأب و هذه الشركة لها أبناء هم :سيارة sunny, وسيارة Maxima  بحيث أن هؤلاء الأبناء يرثون جميع صفات الأب "شركة نيسان" بالإضافة إلى ذلك فكل ابن منهما يتفرد بصفات خاصة به,  هذا بكل بساطة مبدأ الوراثة في السي شارب.
نريد الآن أن نقوم بتحويل المثال السابق إلى برنامج, ولكن قبل ذلك يجب أن تعرف عدة أمور :
الكلاس الأب يدعى Base Class  "or super class" ,
والكلاس الابن يدعى Derived Class "or sub class".
في البرنامج التالي سنقوم بإنشاء ,4 classes أحدها للأب "NISSAN" , والآخر للابن الأول "Maxima", والثالث للابن الثاني "Sunny", والأخير بداخله الدالة Main .
التعبير عن وراثة الابن Maxima  للأب NISSAN  في السي شارب يتبع الأسلوب التالي : class Maxima : NISSAN
ونفس الطريقة مع الكلاس Sunny ووراثته للكلاس class Sunny : NISSAN    , NISSAN
بحيث أن رمز الوراثة هو " : " والذي يسمى "colon symbol".
من المهم معرفة أن أي Derived class لا يمكنه وراثة أكثر من Base class واحد فالسي شارب لا تدعم الوراثة المتعددة "فعلا, فلو نظرت إليها منطقيا لرأيت أنه من المستحيل أن يكون للابن أكثر من أب !!".
سوف نقوم الان بكتابة برنامج console application بحيث يحتوي على 4 كلاس داخل namespace واحدة
1- في البداية سأكتب الكلاس الأب NISSAN :
class NISSAN
    {
       public NISSAN()//constructor
        {
       Console.WriteLine("NISSAN is the base  class");
        }

        public void Company()
        {
         Console.WriteLine("the company location in japan");
        }
    }
}
الكود السابق فيه تعريف الكلاس NISSAN , عرفنا بداخله الـ Constructor, و الدالة Company والتي تطبع موقع الشركة .
2- ثانيا سأكتب الكلاس الابن MAXIMA :
class MAXIMA : NISSAN
    {
        public MAXIMA() //constructor
        {
            Console.WriteLine("MAXIMA is derived class from NISSAN");
        }
        public void FuelTank()
        {
            Console.WriteLine("the fueltank capacity in MAXIMA is:70 L");
        }
    }
الكود السابق هو  تعريف الكلاس Maxima  الذي يرث الكلاس NISSAN , عرفنا بداخله الـ Constructor , و الدالة FuelTank  والتي توضح سعة الوقود اللازمة للسيارة.
3- ثالثا ساكتب الكلاس الابن SUNNY :
class SUNNY : NISSAN
    {
        public SUNNY() //constructor
        {
            Console.WriteLine("SUNNY is derived class from NISSAN");
        }
        public void FuelTank()
        {
            Console.WriteLine("the fueltank capacity in SUNNY is:50 L");
        }
    }
الكود السابق هو تعريف الكلاس Sunny   الذي يرث الكلاس NISSAN , عرفنا بداخله الـ Constructor , و الدالة FuelTank  والتي توضح سعة الوقود اللازمة للسيارة.
4- سنكتب  الآن كلاس MainClass لكي نكتب بداخلها تعريف الدالة Main كالتالي :
حيث في السطر 5 أنشأنا object من الكلاس Maxima  "أحد أبناء نيسان"كممثل عن هذا الكلاس, بمجرد وصول الكومبايلر لهذا السطر فإنه سينتقل مباشرة لينفذ الـ constructor للكلاس Maxima  و هذا الـ Constructor بدوره سيستدعي الـ Constructor للكلاس الأب NISSAN   ليتم تنفيذه.
ومن هنا نستنتج أنه دائما يتم تنفيذ الـ Constructor للكلاس الأب أولا ثم تنفيذ الـ Constructor للكلاس الوارث"الابن" , ويتضح ذلك من خلال السطرين الأول والثاني من المخرجات .
ثم لاحظ السطرين (6 – 7 ) كيف أن هذا الكائن "maxima" تمكن من الوصول للدالة FuelTank الموجودة في الكلاس "Maxima" الذي أنشئ منه الكائن, ومن الوصول للدالة Company الموجودة في الكلاس الأب "NISSAN" و النتيجة هي السطرين الثالث والرابع من المخرجات.
ومن هنا تأكدنا من أن الكائن الذي يتم تعريفه من الـ Derived class الابن,  يستطيع الوصول للدوال الموجودة في الـ Derived class وأيضا الموجودة في الـ Base class الاب.
و الاسطر (9-11) تتبع نفس الاسلوب المشروح تماما .
والمخرجات للبرنامج :
وأخيرا أتمنى أن أكون وفقت في عرض الفكرة ..
                                                
والسلام عليكم ………

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

إرسال تعليق