الواجهات interfaces

السلام عليكم

كيف حالكم جميعاً
-أووووف ألن تكف عن جملك المبتذلة-
اللهم أنا لا نسأل ردك القضاء ولكن نسألك اللطف فيه
ما الذي تفعله هنا يا أخ عبده
-لست عبده أنا شادي-
إذاً بربك يا أخ شادي كف عن تقليد عبده
لأن عبده واحد يكفي وصدقني لو كنت مكاني لما قبلت بوجود ثاني
أظنك تفهمني طبعاً
-نعم أفهمك-
جيد أنك تفهمني
عن ماذا كنا نتحدث
-كنا نتحدث عن الجمل المبتذلة-
هاهاهاه هيهي خخخخخخ
كفوا عن الضحك جميعاً
آخر تحذير يا أخ شادي وإلا سأضطر آسفاً إلى طردك
على كل حال سنتكلم اليوم عن الواجهات interface
الواجهات وجدت في جافا من أجل ثلاث استخدامات
1-حل مشكلة الوراثة المتعددة multiple inheretance
النموذج الرئيسي للبرمجة الكائنية يحتوي على مفهوم الوراثة المتعددة
بمعنى أن يكون للفئة class أكثر من أب
مطوري لغة الجافا ملتزمين بنموذج البرمجة الكائنية
لكنهم وجدوا أن هذا المفهوم يسبب تضارب كبير لدى المبرمج
لكنه فعلياً منطقي
الإنسان مثلاً لديه أبوان يرث منهما جيناته
الخفاش يرث من الثديات والطيور
هذا يبين لنا الموضوع أكثر
المشكلة تحصل في التضارب الحاصل بالوراثة
مثلاً الخاصية أ موجودة لدى اثنين من الأباء
هل منطقي أن نقول أن الابن لديه نفس الخاصية مرتين لكن بأسلوب مختلف
على سبيل المثال الثديات تأكل والطيور تأكل بأسلوب مختلف فهل يعقل أن نقول أن الخفاش يأكل كالثديات ويأكل كالطيور
-هذا هو الحل المتبع في c#-
عن نفسي أرى هذا غير منطقي
لماذا إذن أصبح منطقياً في الوراثة من الواجهات
أصبح منطقياً لأني أتكلم عن الأصل أتكلم عن الأكل كتجريد دون وصف للأكل
2-الواجهات توضح التصميم الخاص بالنظام بشكل جيد بدون تعقيدات ببساطة نستطيع القول المزيد من الترتيب
3-الواجهات تساعد في المشاريع الضخمة
هناك مفهوم برمج من الواجهة Program to interface
بمعنى أنك عندما تبرمج استخدم الواجهات لأنها تعطيك مرونة غير عادية
بحيث لو احتجت لتتغير في المستقبل لن تواجه أية مشاكل
مثال
لو كان لديك نظام متابعة logger يقوم بإرسال بريد إلكتروني في حالة حصول أي خطأ في النظام
لو قمت ببرمجة النظام مباشرة النظام سهل ولا يحتوي تعقيدات كثيرة

public class EmailLogger{
	public void log(Error e){
		//do something
	}
}

طبعاً واضح أن هذا النظام غير مستقل بذاته وإنما سيوضع في نظام آخر
أوووووووه
ظهرت مشكلة جديدة نحتاج إلى نظام متابعة إضافي على sms
يجب أن تقوم بالتغيير على كل شيء قمت به
انظروا لو برمجت النظام من الواجهة

public interface Logger{
	public void log(Error e);
}
public class EmailLogger implements Logger{
	public void log(Error e){
		//do something
	}
}

استخدم في برامجك مؤشر من نوع Logger وليس من نوع EmailLogger
مثلاً

public EmployeeSystem(Logger log){
	log.log(new Error("some message"));
}

لاحظ لو أردت أن تغير كل ما عليك فعله أن تقوم بإنشاء فئة جديدة

public class SMSLogger implements Logger{
	public void log(Error e){
		//do something
	}
}

وعلى أساس الكائن الذي سترسله لنظام العمال سيكون التنبيه

تكلمنا عن الواجهات كمفهوم فلنتكلم عنها من جانب تطبيقي -أقصد آلية إنشاء واجهة جديدة-
طبعاً بما أني مبرمج جافا فالحديث سيكون عن الواجهات في جافا
الواجهة في جافا هي عبارة عن فئة مجردة كلية
بمعنى أن دوالها كلها مجردة abstract
لها معاملة خاصة تختلف عن باقي الفئات
والإختلافات هي كالتالي
1-تستطيع فيها استخدام الوراثة المتعددة وليس كباقي الفئات
2-كل الدوال فيها رؤوس head بدون أجساد body -رعب-
مثال

public  interface Class1 extends Class2 , Class3 {
	public void method1();
}

3-لا يمكنك وراثتها ولكن بناؤها

public class SMSLogger implements Logger{
	public void log(Error e){
		//do something
	}
}

4-لا تستطيع عمل كائنات منها وإنما مؤشرات منها

Logger log;//صحيح
Logger log=new Logger();//خطأ
Logger smslog=new SMSLogger();//صحيح

هذا هو القالب العام للواجهات في جافا

ستجدون بشكل عام أن الكلام هنا كلام نظري على الغالب
لكن تأكدوا أن الموضوع مفيد جداً
أترككم الآن في رعاية الله

مراجع:
1- موضوع بعنوان Java Job Interview questions in Object Oriented Programming
من مدونة الأخ هويدي

http://m-hewedy.blogspot.com/2009/03/java-job-interview-questions-in-object.html

Tags: , , , , , ,

10 Responses to “الواجهات interfaces”

  1. abuoof قال:

    جزاك الله خير
    موضوع مهم جداً

  2. admin قال:

    شكراً لك أبوعوف
    هل لديك أي ملاحظات؟؟

    تحياتي

  3. abuoof قال:

    معذرة فقد رحت سريعاً لضيق الوقت ولكن كالمعتاد يكون لي عودة
    هذا السطر
    4-لا تستطيع عمل كائنات منها وإنما مؤشرات منها
    Logger log;//صحيح
    Logger log=new Logger();//خطأ
    Logger smslog=new SMSLogger();//صحيح
    ماذا يعني
    وجزاك الله كل خير

  4. admin قال:

    تستطيع أن تقول أن لديك مصنع بشكل مجرد
    لكن لا تستطيع أن ترخص هذا المصنع مالم تحدد ماهيته
    نفس الموضوع هنا في جافا
    تستطيع أن تقول لدي واجهة لكنك لا تستطيع أن تنشئ كائناً ما لم تعرف ماهيته الواجهة

    تحياتي

  5. abuoof قال:

    فهمتها جزاك الله كل خير

  6. admin قال:

    أي مشاكل يمكنني أن أعيد طريقة الشرح

    تحياتي

  7. عائد قال:

    السلام عليكم ورحمة الله وبركاته
    حياك الله أخوي وربي يجزيك على هذه النبذة الجميلة جدا والتي ارجو ان يجعلها الله في ميزان حسناتك .
    ثانيا يا ريت تعملنا درس عن كيفية انشاء الجرافيكس و الوصت ما تسمى بالفعل والحدث
    action and event مع الكثير من الأمثلة و الله يجزيك الخير
    أخوك العائد مبتدء المبتدئين

  8. admin قال:

    الله يحييك أخ عائد
    بالنسبة لموضوع الجرافيكس فهو موضوع طويل يحتاج إلى فترة من الكتابة
    لكن يمكنني أن أوجهك إلى موقع بالعربي يساعدك
    ألا وهو الفريق العربي للبرمجة
    وهذه وصلة منتدى الجافا
    http://www.arabteam2000-forum.com/index.php?showforum=43

    تحياتي

  9. LuLu قال:

    بارك الله فيك.. تدوينة رائع
    في ميزان حسناتك إن شاء الله
    كنت بدي أسأل نفس سؤال الاخ أبوعوف .. بس فهمتها الحمد لله ..

  10. admin قال:

    ويبارك فيك
    أية أسئلة أنا جاهز
    اشتقت لأسئلتك أخي أبو عوف :(

    تحياتي

Leave a Reply