الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

what is the difference between the abstract class and the interface(interface keyword)

مغلق
بدأه Abder-Rahman في 8 أغسطس 2006 · 8 رد · 2,981 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

i know that the abstract class look like the interface(interface key word. but im sure that there is a specific difference betwwen them. so please answer me.

.?(what is the difference between the abstract class and the interface(interface

#2

طبعا في لغة ++C لا يوجد شئ مثلاً إسمه interface

لكن في لغة C++.NET يوجد شئ إسمه interface

لكن الإختلاف البسيط بينهما

أن abstract class يسمح لك بتعريف دوال - تعريف وليس تصريح - لكن يجب أن تكون واحدة منهم pure virtual وعند إشتقاقها فقط يعد تعريف الدالة pure virtual - طبعا تستطيع إعادة تعريفها جميعاً - لكي تستطيع تكون كائن منه .

لكن ال interface لا يسمح لك بذلك فقط تكتب تصريح للدوال ويتم إعادة تعريفها كلها لكي تتمكن من تكون كائن

تم تعديل هذه المشاركة بواسطة b.m.s في 8 أغسطس 2006 في 11:35

#3

interface في سي بلس بلس هي مجرد struct أي أن كل العناصر هي public بالفطرة

#4
اقتباس
طبعا في لغة ++C لا يوجد شئ مثلاً إسمه interface

لم أفهم ما تقصده و لكن ال ++C يوجد فيها interface بالمفهوم الطبيعي.

الAbstract Classes لا توجد صريحة في ال++C بل يجب أن تكون الclass تحتوي على الأقل على Pure Virtual Function واحدة حتى يكون تعريف object منها مستحيلاً و هنا تفرض على مستخدمها أن يرث منها أولاً.

على العموم نعود للسؤال الinterface فقط يحوي الdeclaration للpublic functions التي يجب أن توجد في الclass التي ترث منه .. أما الAbstract Class فتحوي public functions يمكن أن تكون virtual أو pure virtual و الفرق أن الpure virtual يجب أن تقوم بعد الوراثة منها بكتابة override لها أما الvirtual فيمكن أن تحتوي على default implementation يمكن عمل override له حسب الحاجة ...

و بوجه عام يمكن اعتبار الinterface هو abstract class كل الfuncrions فيه pure virtual

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#5
bashmohandes كتب:
لم أفهم ما تقصده و لكن ال ++C يوجد فيها interface بالمفهوم الطبيعي.

لا يوجد شئ إسمه interface في ++C إلا إذا انت إفترضت ذلك وهذا يفرق

هذه من جهة ومن جهة ثانية

اقتباس
الAbstract Classes لا توجد صريحة في ال++C بل يجب أن تكون الclass تحتوي على الأقل على Pure Virtual Function واحدة حتى يكون تعريف object منها مستحيلاً

و

اقتباس
أما الAbstract Class فتحوي public functions يمكن أن تكون virtual أو pure virtual و الفرق أن الpure virtual يجب أن تقوم بعد الوراثة منها بكتابة override لها أما الvirtual فيمكن أن تحتوي على default implementation يمكن عمل override له حسب الحاجة ...

كيف يتم الجمع بينهما لان الــ Abstract Classes مرة يجب أن يحتوي على الأقل Pure Virtual Function ومرة يمكن أن يحتوي فقط على virtual

والصحيح أن abstract calss موجود في الــ ++C

لكن بدون كلمة محجوزة مثل أغلب اللغات اكن له طريقة صممت من أجله ولو رجعت إلى تعريفه تجده أنه المصمم ليكون parent او base ولا يمكن الإشتقاق منه وهذا في لغة ال++C

موجود ويمكن عمله فقط بإضافة = 0 إلى نهاية ال Method ويكفي فقط واحدة لتكون كذلك

أما الــ interface بمعناها

يعني إنه يمنعك من إنك تكتب implementation للدوال اللي عرفتها ويجبر كل اللي إشتقوها أن يعيدوا تعريفها وهذا غير موجود إلا إذا إفترضته

لكن إذا بندخل الإفتراضات فهذه شغله ثانية ;)

تم تعديل هذه المشاركة بواسطة b.m.s في 8 أغسطس 2006 في 14:03

#6

كلاً من الinterface و الAbstract Class موجودين في ال++C و لكن بدون تصريح عنهم بمعنى بدون keyword لكل منهم و لكن المبدأ نفسه موجود و يتم استخدام الclasses في تعريف أي منهم و لكن طريقة كتابة الclass هي التي تحدد

فعندما تكتب abstract class فانك تقوم بوضع على function واحدة على الأقل pure virtual بمعنى

virtual void MyFunction() = 0;

و هذه الfunction تجعل الcompiler يعترض على أي محاولة لانشاء object من نوع هذه الclass و هذا لأن هذه الfunction غير معلومة... و هنا يضطر مستخدم الclass الى الورائة منها لاستخدامها و كتابة كود لهذه الfunction... و يمكن أن تحتوي الabstract class على functions أخرى virtual و لكن بها default implementation أي أنه يمكنك عمل override لها حسب الحاجة و ليس فرضاً عليك...

أما الinterface فهو class كل الfunctions فيه Pure Virtual Functions بمعنى أنه يجب عمل implementation لجميع الfunctions عندما ترث منه...

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#7
اقتباس
لكن بدون تصريح عنهم بمعنى بدون keyword

لايجب وجود keyword حتى نقول بدون تصريح فالجملة هذه ' 0= ' تعتبر تصريح لكن لكل لغة تصريحها الخاص بها . مثلاً لكتابة المعامل OR في لغة ++C نكتب || لكن في لغة Visual Basic.Net نكتب OrElse ورغم كذا تعتبر كلها تصريح لكن كل لغة تصرح بطريقتها .

ولنحدد الإختلاف أنا أقول إن interface بمعناها الطبيعي الحقيقي غير موجود . لا تقول لي class ودواله public pure virtual أو struct ودواله pure virtual لأنه في كلا الحالتين يسمحون إنك تعرف data او property بكذا راح يكون abstract class لأن الــ abstract class

يسمح لك default implementation لدواله ويسمح لك بتعريف data لكن لا بشرط وهو إنه يجب أن تكون هناك داله واحدة على الأقل pure virtual

حتى لا يمكن للمبرمج تكون كائن منه .

أما interface فهو لا يمسح لك لا بتعريف default implementation لدواله ولا يسمح بتعريف data فقط يسمح ب declaration للدوال

فهل هذا موجود في لغة ++C . لا تقل لي class وكل دواله pure virtual لأنه لو أضفت تعريف data في هذا class ما راح يرفض الكمبايلر

لأنه يعتبره abstract class وليس interface .

وأخيراً Bjarne Stroustrup شرح في كتابه The C++ Programming Language عن abstract class لما وصل إلى pure virtual وما ذكر شئ عن interface فهل تتوقع إنه نسي شئ في اللغة نفسها ..... -_- ربما ;)

#8
اقتباس
أما interface فهو لا يمسح لك لا بتعريف default implementation لدواله ولا يسمح بتعريف data فقط يسمح ب declaration للدوال

فهل هذا موجود في لغة ++C . لا تقل لي class وكل دواله pure virtual لأنه لو أضفت تعريف data في هذا class ما راح يرفض الكمبايلر

لأنه يعتبره abstract class وليس interface .

مع احترامي لرأيك هذا لا يعني أن ال ++C لا يمكنها عمل interfaces ففي النهاية لعمل interface هناك شروط يجب أن تتبعها لو لم تتبعها ستحصل على شئ اخر abstract class أو حتى class عادية هذه مشكلة المبرمج بالدرجة الأولى ... و لهذا ستجد معظم المكتبات تفرق بين الinterfaces و الabstract classes في ال++C باستخدام الnotations مثل وضع حرف I في أول اسم الinterface أو وضع T أو A في أول اسم الAbstract Class ...

و كل هذا لأن ال++C كانت تتعامل مع الinterface و الabstract classes على أنها شئ شبيه بالdesign patterns و لكن ليس جزء من اللغة

أما أن اللغات الأحدث فرقت بين الinterfaces و ال abstract classes بkeywords و أصبحت تعتبرهم جزء من اللغة فهذه ميزة في اللغات الجديدة و لكنها ليست عيباُ في ال++C فمثلآُ ال++C هي لغة تدعم الMulti-Inheritance من أكثر من class و هي غير موجودة في اللغات الأحدث فهل تعتبر عيباً في اللغات الجديدة؟ ارجو ألا تقول أن تم استبدال الMultiple-Inheritance بالوراثة من class واحدة و عمل implementation لأكثر من interface لأن هذا ليس بديل الMultiple-Inheritance .

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#9

أخوي bashmohandes

لا يعني أنك تستيطع عمل شئ أنه موجود في اللغة أساساً .أنا أتكلم عن ما هو جزء من اللغة ولا أتكلم عن ما يمكنك عمله .

مثلاً GC غير موجود في اللغة لكن تستطيع عمله. وأيضاً منع الــ classes الأخرى من الوراثة منك موجود في #C كلمة محجوزة وهي sealed لكن في الــ ++C غير موجودة الخاصية هذه لكن يمكنك فعلها مع قليل من الكود. وقيس على ذلك .

وأيضا تستطيع عمل شئ وتفترض إنه شئ آخر . أي تستطيع عمل abstract class وتفرض إنه interface عبر حرف مثل I تضيفه إلى بداية الإسم . لكن

في النهاية هو abstract class بالنسبة للكمبايلر وبالنسبة للغة نفسها .

وأنا لم أقل إن هذا عيب في الــ ++C بالعكس هذه اللغة تستطيع عمل كل شئ بها فقط مع قليل من الصبر لكن أنا أردت أن أبين أن interface بمعناه الحقيقي غير موجود .

اقتباس
ارجو ألا تقول أن تم استبدال الMultiple-Inheritance بالوراثة من class واحدة و عمل implementation لأكثر من interface لأن هذا ليس بديل الMultiple-Inheritance .

أوافقك لا تعتبر Multiple-Inheritance لأنها لاتقوم بكل ما تقوم به الMultiple-Inheritance . ورغم كذا قالوا إن هذه اللغات لا تدعم الMultiple-Inheritance على الرغم من إنك تستطيع القيام بكل ما تقوم به الMultiple-Inheritance بقليل من الكود .

هذا الموضوع مغلق.

مواضيع مشابهة