متى نقول أن الحل هنا لا ينفع فيه الا interface
الـ abstract class تقوم بنفس وظيفة الـ interface بل و أكثر,
لكن متى نقول أن الحل هنا لا ينفع فيه الا interface
الإجابة الصحيحة
السلام عليكم
بداية أريد أن أعقب على مقدمة سؤالك
الـ 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)
السلام عليكم
بداية أريد أن أعقب على مقدمة سؤالك
الـ 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: اجابة مفصلة وممتازه يعطيك العافيه على الشرح الوافي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !