متى نقول أن الحل هنا لا ينفع فيه الا interface

salim • منذ 5 سنوات

الـ abstract class تقوم بنفس وظيفة الـ interface بل و أكثر,
لكن متى نقول أن الحل هنا لا ينفع فيه الا interface

كلمات دليلية: interface

الإجابة الصحيحة

Abdullah Alhariri • منذ 5 سنوات

السلام عليكم

بداية أريد أن أعقب على مقدمة سؤالك 

الـ abstract class تقوم بنفس وظيفة الـ interface بل و أكثر

ال Abstract Class شئ مختلف عن ال Interface ، للاسف يظن الكثيرون أن أحدهم يحل مكان الآخر بسبب التشابه الكبير فيما بينهم ولكن هذا الكلام غير صحيح.

الـ Abstract Class هو نوع خاص من ال Classes لا يمكن أن ننشأ كائن جديد (new instance) منها لأنها صممت لكي تقوم الكلاسات العادية بالوراثة منها وتستطيع هذه الكلاسات الوارثة تطبيق الدوال الموجودة بداخل ال Abstract Class وأيضاً عمل override لها، كما أن ال Abstract Class يمكن أن يحتوي على دول (Methods) كاملة و دول مجردة (Abstract Methods)، ولا يمكن للكلاسات الوارثة أن ترث أكثر من Abstract Class  واحد.

أما الـ Interface فهو عبارة عن تعريف لهيكلية معينة يجب على الكلاسات الوارثة منه التقيد بهذه الهيكلية وتنفيذها ، والـ Interface لا يمكن أن يحتوي على جسم للدوال الموجودة بداخله هو فقط تعريف للدوال والـ Class الذي سيقوم بالوراثة هو من ينفذ بطريقته الخاصة ، كما يمكن للكلاسات الوارثة أن ترث أكثر من Interface بعكس الكلاسات الوارثة من Abstract Class .

التعريفات السابقة هي تعريفات لتوضيح بعض الفروق بين الـ Abstract Class  و الـ Interface وأستطيع تلخصيها كما يلي : 

Abstract Class Interface
يمكن أن تحتوي على Abstract and Non-Abstract Methods تحتوي فقط على Abstract Methods
لا يمكن إنشاء كائن جديد منها لا يمكن إنشاء كائن جديد منها
يمكن للكلاسات الوارثة الوراثة من Abstract Class واحد فقط يمكن للكلاسات الوارثة الوراثة من أكثر من Interface
   

بالنسبة للجواب على سؤالك 

متى نقول أن الحل هنا لا ينفع فيه الا interface

هناك حالات كثيرة جداً لا ينفع معها إلا الـ Interface ومنها حالة معروفة جداً وهي إذا أردت أن تستعمل ال Multi Inheritance إستخدم الـ Interface 

ولكن هناك قاعدة أتبعها عند الاختيار وهي 

- إستخدم الـ Abstract Class إذا كان "A is B" مثال عليها

إذا أردت التعامل مع عدة أنواع من قواعد البيانات ولتكن MsSQL و MySql فكلاهما عبارة عن قاعدة بيانات

بهذه الحالة أقوم بإنشاء Abstract Class بإسم Database لإن كلاهما عبارة عن Database

- أستخدم الـ Interface إذا كان “A is capable of [doing] as B” أي إذا كان A  يستطيع التصرف كـ B ومثال عليها  

إذا كان لديك مصدر للبيانات لإستخراج البيانات منه وهذا المصدر غير معروف نوعه من الممكن أن يكون Excel File أو Json File أو حتى Web API

كل نوع من أنواع المصادر السابقة يوجد طريقة خاصة للاتصال بها وطريقة خاصة لإستخراج البيانات فبهذه الحالة نستخدم Interface بإسم Source و Interface أخرى بإسم Connector

ونعرف به الدوال المطلوبة ومن ثم نعرف Class لكل نوع وكل Class يقوم بالاتصال و استخراج البيانات بطريقته الخاصة .

أمل أن أكون قد أوصلت المعلومة بشكل صحيح 

بالتوفيق إن شاء الله.

 

الإجابات (1)

Abdullah Alhariri • منذ 5 سنوات
الإجابة الصحيحة
مميز

السلام عليكم

بداية أريد أن أعقب على مقدمة سؤالك 

الـ abstract class تقوم بنفس وظيفة الـ interface بل و أكثر

ال Abstract Class شئ مختلف عن ال Interface ، للاسف يظن الكثيرون أن أحدهم يحل مكان الآخر بسبب التشابه الكبير فيما بينهم ولكن هذا الكلام غير صحيح.

الـ Abstract Class هو نوع خاص من ال Classes لا يمكن أن ننشأ كائن جديد (new instance) منها لأنها صممت لكي تقوم الكلاسات العادية بالوراثة منها وتستطيع هذه الكلاسات الوارثة تطبيق الدوال الموجودة بداخل ال Abstract Class وأيضاً عمل override لها، كما أن ال Abstract Class يمكن أن يحتوي على دول (Methods) كاملة و دول مجردة (Abstract Methods)، ولا يمكن للكلاسات الوارثة أن ترث أكثر من Abstract Class  واحد.

أما الـ Interface فهو عبارة عن تعريف لهيكلية معينة يجب على الكلاسات الوارثة منه التقيد بهذه الهيكلية وتنفيذها ، والـ Interface لا يمكن أن يحتوي على جسم للدوال الموجودة بداخله هو فقط تعريف للدوال والـ Class الذي سيقوم بالوراثة هو من ينفذ بطريقته الخاصة ، كما يمكن للكلاسات الوارثة أن ترث أكثر من Interface بعكس الكلاسات الوارثة من Abstract Class .

التعريفات السابقة هي تعريفات لتوضيح بعض الفروق بين الـ Abstract Class  و الـ Interface وأستطيع تلخصيها كما يلي : 

Abstract Class Interface
يمكن أن تحتوي على Abstract and Non-Abstract Methods تحتوي فقط على Abstract Methods
لا يمكن إنشاء كائن جديد منها لا يمكن إنشاء كائن جديد منها
يمكن للكلاسات الوارثة الوراثة من Abstract Class واحد فقط يمكن للكلاسات الوارثة الوراثة من أكثر من Interface
   

بالنسبة للجواب على سؤالك 

متى نقول أن الحل هنا لا ينفع فيه الا interface

هناك حالات كثيرة جداً لا ينفع معها إلا الـ Interface ومنها حالة معروفة جداً وهي إذا أردت أن تستعمل ال Multi Inheritance إستخدم الـ Interface 

ولكن هناك قاعدة أتبعها عند الاختيار وهي 

- إستخدم الـ Abstract Class إذا كان "A is B" مثال عليها

إذا أردت التعامل مع عدة أنواع من قواعد البيانات ولتكن MsSQL و MySql فكلاهما عبارة عن قاعدة بيانات

بهذه الحالة أقوم بإنشاء Abstract Class بإسم Database لإن كلاهما عبارة عن Database

- أستخدم الـ Interface إذا كان “A is capable of [doing] as B” أي إذا كان A  يستطيع التصرف كـ B ومثال عليها  

إذا كان لديك مصدر للبيانات لإستخراج البيانات منه وهذا المصدر غير معروف نوعه من الممكن أن يكون Excel File أو Json File أو حتى Web API

كل نوع من أنواع المصادر السابقة يوجد طريقة خاصة للاتصال بها وطريقة خاصة لإستخراج البيانات فبهذه الحالة نستخدم Interface بإسم Source و Interface أخرى بإسم Connector

ونعرف به الدوال المطلوبة ومن ثم نعرف Class لكل نوع وكل Class يقوم بالاتصال و استخراج البيانات بطريقته الخاصة .

أمل أن أكون قد أوصلت المعلومة بشكل صحيح 

بالتوفيق إن شاء الله.

 

Ali Majrashi: اجابة مفصلة وممتازه يعطيك العافيه على الشرح الوافي

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !