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




في هذا الرد سنوضح الفرق بين الـ Interface والـ Class من ناحية الوراثة ـ

بينما بقية المقارنات مشروحة في الردود تحت بواسطة الاعضاء الكرام ..






احيانا نحتاج الى استعمال مبدأ الوراثة ، ولكن معظمنا لايعرف ماذا يستخدم للوراثة ، هل يستخدم الـ Interface او يستخدم الـ Class ؟


ولكن المقالة التالية ستوضح بشكل قاطع متى يستخدم الـ Class ومتى يستخدم الـ Interface











سؤال / متى استخدم الوراثة من كلاس (Inheritance from Base Class) ومتى استخدم  الوراثة من الواجهات البرمجية(Inheritance from Interface) ؟

او ممكن اعادة صياغة السؤال بضمير المتحدث :-

سؤال / انا بحاجة لتطبيق مبدأ الوراثة ، فهل اقوم بانشاء Base Class او اقوم بانشاء Interface ؟



-----------------------------------------------


الجواب :- المفهومان يتشابهان الى حد كبير لدرجة انك احيانا لا تعلم ايهما تستخدم .. لذلك وجدت العلاقة التالية التي تحدد لك بوضوح ايهما يجدر استعماله :-

العلاقة الاولى : Is-a ، عندما تكون لدينا هذه العلاقة بين اثنين Types ، هنا نقوم بانشاء Base Class ونقوم بالاشتقاق منها ((Inheritance from Base Class)

العلاقة الثانية : can-do ـ عندما تكون لدينا هذه العلاقة بين اثنين Types ، هنا نقوم بانشاء واجهة برمجية ونقوم بالاشتقاق منها (Inheritance from Interface)


--


مثال  من مكتبات ال.NET ... هناك كلاس اسمه Bitmap ، هذا الكلاس مشتق من الكلاس Image
لماذا قام مصمم اللغة بتعريف Class باسم  Image ؟، لماذا لم يقم بتعريف Image كـ Interface ؟

السبب لان العلاقة المستخدمة بين الكلاسين هي Is-a >>
Bitmap Is an Image




وفي نفس الوقت ، الكلاس Bitmap مشتق كذلك من واجهة برمجية تسمى IDisposable وايضا من واجهة اخرى تسمى ICloneable
لماذا قام مصمم اللغة بتعريف Interface باسم IDisposable ، لماذا لم يقم بتعريف IDisposable كـ  Class  ؟

لان العلاقة المستخدمة هنا can-do >>
Bitmap can do Dispose
Bitmap can do Clone


اذن الشكل العام للكلاس Bitmap سيكون كالتالي :-

PHP كود :
public class Bitmap Image IDisposable ICloneable
{






--



مثال اخر/ انظر هذا الكود :-


PHP كود :
   class Ahmed PersonIWalkISleepISwim
   
{
   





في الكود السابق هناك كلاس باسم Ahmed وهو يشتق من Base Class المسمى Person ، ويشتق ايضا من ثلاثة Interface

السبب في اشتقاق Ahmed من الكلاس Person
هو وجود علاقة Is-a >>
ِAhemd is a Person


بينما السبب في الاشتقاق من الInterfaces المسميات IWalk و IEat و ISleep
هو وجود العلاقة can-do >>
Ahmed can walk
Ahmed can eat
Ahmed can sleep



لذلك يجب ان تُعرًف Person كـ Class ، لانها تحقق علاقة Is- a

بينما يجب عليك ان تُعرًف IWalk و IEat و ISleep كـ Interface ، لانهم يحققون علاقة can- do


وهذا كود تعريفهم :-
PHP كود :
   //base class
 
   class Person
    
{
 
   }

 
   //interfaces
 
   interface IWalk
    
{
 
   }
 
   interface IEat
    
{
 
   }
 
   interface ISleep
    
{
 
   




--


الخاتمة :-


دائما عندما تقوم بكتابة اكوادك وعندما تكون بحاجة لاستعمال مبدأ الوراثة ، يجدر بك ان تعرف متى تقوم بانشاء Interface و متى تقوم بانشاء Base Class وذلك باستخدام العلاقتين اعلاه .



تحياتي[/b]
الرد }}}


الردود في هذا الموضوع
[نقاش] الفرق بين الـ Interface , Abstract Class , Base Class , Sealed Class - بواسطة الشاكي لله - 29-06-16, 01:43 AM

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

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


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