تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[نقاش] الفرق بين الـ Interface , Abstract Class , Base Class , Sealed Class
#11
ماشاءالله

تم تثبيت الموضوع Smile

تحياتي لكم
الرد }}}
تم الشكر بواسطة: ابو ليلى , Amir_Alzubidy
#12
Abstract Classes تمكنك من اضافة الكثير من الوظائف للتطبيق بدون الاضرار بالكلاسات التي اشتقتها (انا اسميها الابناء)
اذ ان تحديثك للفئة القاعدية  فالتحديثات ستشمل كل الفئات الابناء 
بينما اذا استخدمت Interfases فانك ستكون مجبرا على اعادة تعريف الطرق الجديدة في كل الفئات الابناء.
انا ارى بنظري ان استخدام Abstract Classe هو انسب للتعامل مع كل الفئات ذات القرابة , اي ذات الارتباط ببعضها
بينما Interfaces تعتبر حل امثل للفئات غير المرتبطة.
لتتضح الفكرة اكثر دعني اضرب المثال التالي
لو فرضنا ان لدينا فئة الطائر و فئة الطائرة و كلا الفئتين يمتلكان الطريقة Flay  فانه من السخافة ان نقول ان الطائرة ترث من الطائر فقط لانها تمتلك خاصية الطيران , فانه من المناسب اكثر ان تكون هذه الطريقة موجودة في Interface
و كل فئة تستخدم الطريقة بما يناسبها 
اذا اردنا نقدم تعميما اكثر لحل هذه المشكلة هناك قول اخر هو لما لا يكون لدينا Abstract Classes يشمل على كل الوظائف ليساعدنا في التعديلات المستقبلية توفيرا للوقت اذ انني لن اضطر  لتعديل كل الفئات الاخرى التي تشتق من هذه الفئة (هل تذكر قولنا عن الفئات ذات القرابة و الارتباط) كما انها تسمح لنا باستخدام جزئيات فقط من الوظائف.
الخيار يتوقف عليك و على حسب حاجتك (لا تغفل الجزئية التي تحدث عنها الاخ الشاكي).
نستطيع الاعتماد على Interfaces و كذلك Abstract Classes و كذلك يمكن المزج بينهما.
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#13
معلومة مفيدة اخي خضر ..

واضيف كذلك انه عند تعريف Abstract Class وClass عادية مشتقة من الـ Abstract بهذا الشكل:
PHP كود :
   //abstract
 
   abstract class Name
    
{

 
   }

 
   //normal class (inherts from Name)
 
   class Ahemd Name
    
{

 
   


لو عرفنا Instance من الAbstract class بواسطة طريقة الPointing (كما ذكر اخونا خضر في المشاركة السابقة) ،
PHP كود :
           Name n = new Ahemd(); 

ثم لو قمنا بالاستعلام عن الType بهذا الشكل
PHP كود :
           Name n = new Ahemd();
 
           MessageBox.Shown.GetType().Tostring() );//will return the concrete class (which is Ahmed) 

الـ Type المرجع سيكون Ahmed وليس Name ، ذلك بسبب ان الـ Interface والـ Abstract في حالة الPointing، كلاهما يقومان بإرجاع الـ Concrete type

وفي مثاالنا اعلاه الـ Concrete type هو Ahmed بسبب ان الـ Instance مشار اليه بواسطة متغير من نوع Abstract Smile

--

ومع ذلك ، عند استخدام المقارنة بالـ Type بواسطة المعامل Is  .. سنجد ان الرسالتين في الاسفل سيتم طباعتهما :

PHP كود :
           Name n = new Ahemd();

 
           if (n is Name)
 
           {
 
               MessageBox.Show("Hi"); //will be printed
 
           }
 
           if (n is Ahemd)
 
           {
 
               MessageBox.Show("Hi"); //will be printed
 
           


نعم ، المعامل Is  يرجع True سواء قارنت الـ object بالـ concrete class او بالـ Abtract class

طبعا نفس الموضوع بالضبط يحصل عند استخدام الانترفيس
الرد }}}
تم الشكر بواسطة: khodor1985 , ابو ليلى , sendbad100 , Amir_Alzubidy
#14
بما ان الموضوع انقلب الى نقاش تبادل خبرات ..
دعوني اعرض لكم احدى استخداماتي للـ Interface وايضا الـ Base Class


المشروع الذي اعمل عليه حاليا يحتوي على الكثير من الانظمة .. وهذا شيئ طبيعي لان المشروع عبارة عن لعبة ، ودائما الالعاب تحتوي على الكثير من الانظمة التي عليك مزامنتها مع الاحداث التي تحصل باللعبة

مثلا عند انفجار قنبلة في اللعبة ، الكثير من الانظمة يجب ان تعمل في وقت واحد ، منهم
Damage System
VisualEffect System
SoundEffect System
Score System


هنا نرى ان هذه الانظمة يجب ان تعمل في وقت واحد عند انفجار القنبلة ، وبالطبع يجب ان تتفاعل هذه الانظمة بشكل متزامن وصحيح بين بعضها البعض لذلك -في بعض الاحيان- تحتاج الى ارسال Message بينها ، وايضا تحتاج الى جهة او جهات تستقبل هذه الرسالة وتعالجها ..

لهذا الغرض ـ  نقوم بتعريف Interface لنستعمله لاحقا في التنصت على الرسائل ، ونقوم بتعريف Base Class لاستخدامها في تكوين الرسائل  (كما بالصورة)







اذن ، الانظمة التي بحاجة الى التنصت على الرسائل تقوم بوراثة الـ Interface ، كما هو الحال في الـ Damage System :





وفي احدى سكربتات اللعبة ، توجد الدالة التالية التي تتنفذ عند حصول اي انفجار في اللعبة ، يقوم هذا الكود بارسال رسالة الى جميع الانظمة التي تقوم بالتنصت (التي تشتق من الانترفيس IGameListener) :





وبالتالي ، جميع انظمة الصوت وانظمة المؤثرات البصرية وغيرها من الانظمة ستستلم هذه الرسالة وتقوم بالتفاعل مع الانفجار Smile



وان سالتني كيف شكل الدالة SendMessageToAll ، تفضل Smile



الدالة فقط من سطرين :Smile
ووظيفتها هي الدوران وجلب جميع الـ classes التي تشتق من الـ Interface المسمى IGameListener واستدعاء الدالة Listener  وتمرير الرسالة لها Smile




لماذا تم عمل IGameListiner كـ Interface ؟؟

لانها تحقق علاقة can-do مع الsystem
Damage System can Listen


بينما تم عمل MessageBase كـ Class بسبب ان العلاقة هي Is-A
BombMessage is a message



--


هذا كان احد الامثلة التطبيقية للـ Interface والوراثة
ايضا اذا كان عند الاخوان اي مثال تطبيقي اخر يمكنه المشاركة به لنستفيد Smile
الرد }}}


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [نقاش] نقاش حول تطبيق الفاتورة الإلكترونية فى السعودية المرحلة الثانية Zatca Integration AmrSobhy 3 3,035 22-05-25, 03:49 AM
آخر رد: abuarab
  تعلم Interface Abu Ehab 1 2,356 19-02-18, 10:38 PM
آخر رد: sendbad100
  KeyValuePair Class Abu Ehab 1 2,241 16-12-17, 06:08 PM
آخر رد: sendbad100
  ZipFile Class Abu Ehab 1 2,448 18-11-16, 03:44 AM
آخر رد: abulayth
  [نقاش] الـ Delegate الشاكي لله 11 10,071 01-09-16, 02:27 AM
آخر رد: أبو عمر
  [C#.NET] الفرق بين #String And String Builder c Devahmedsalim 3 4,852 15-09-13, 05:50 PM
آخر رد: sooriaty03
  Tips and Tricks : الفرق بين const و static readonly RaggiTech 0 3,539 14-10-12, 03:05 PM
آخر رد: RaggiTech
  الفرق بين التعريف باستخدام overridde و new RaggiTech 0 3,075 14-10-12, 02:57 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: