29-06-16, 01:43 AM
(آخر تعديل لهذه المشاركة : 30-06-16, 05:00 AM {2} بواسطة الشاكي لله.)
السلام عليكم ورحمة الله وبركاته
في هذا الرد سنوضح الفرق بين الـ 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 : Person, IWalk, ISleep, ISwim
{
}
في الكود السابق هناك كلاس باسم 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]

