الأربعاء، 6 فبراير 2013

متى يجب استخدام الفئة المجردة (Abstract Class) و متى يجب استخدام الواجهة (Interface) في جافا (java)

الفئة المجردة في جافا Abstract class in java


جميع الفئات الموروثة من الفئة المجردة "X" ، يجب أن تحتوي على المناهج المجردة (الفئة المجردة فقط) التي تم تعريفها في الفئة المجردة "X" (يجب تنفيذ المناهج المجردة الموروثة التي تم تعريفها في الفئة المجردة "X") .
المناهج المجردة = abstract methods
الفئة المجردة = Abstract Class




لماذا نستخدم الفئة المجردة في جافا


إذا كانت فئة في أحد برامج جافا غير محتاجة للحصول على مثيل (نحن لا نريد إنشاء كائن object) من هذه الفئة أو نريد منع أي شخص من إنشاء مثيل من فئة التي من المفترض أن يتم تمديدها أولًا) فسوف نأخذها على أنها فئة مجردة باستخدام الكلمة abstract، ولكن بالأحرى هذه الفئة هي متاحة لبقية الفئات الأخرى ليمتدوا منها. الفئات الموروثة من فئة مجردة، تفرض خصائص مشتركة مع الفئة المجردة الفائقة (super abstract class).
مثيل = instance = object
إنشاء مثيل = instantiating = create object
الفئة الفائقة (السوبر) = super class


Car، Bus و Truck هي فئات موروثة عن الفئة المجردة Vehicle. تفرض كل هذا الفئات خصائص مشتركة من Vehicle. ولكن لا يمكننا إنشاء مثيل للفئة Vehicle (لا يمكن إنشاء كائن من فئة Vehicle) بدلا من ذلك يمكننا إنشاء مثيل للفئات Car ، Bus وTruck (يمكننا إنشاء كائن من الفئات Car ، Bus وTruck).
Car = سيارة
Bus = حافلة
Truck = شاحنة
Vehicle = مركبة

الواجهة في جافا Interface in Java


الواجهة لا يمكنها أن تمتلك إلا إعلان المناهج (تحتوي فقط إلا على توقيع المنهج) والإعلانات الثابتة constant declarations (متغير الإعلانات variable declarations التي تم تعريفها على حد سواء الثابت static والنهائية final). لا يمكن إنشاء مثيل لواجهة (لا يمكن إنشاء كائن من واجهة)، الفئات التي تنفذ implements واجهة معينة، يجب أن تحتوي على كافة المناهج التي تم إعلانها في هذه الواجهة. الواجهة لا يمكن أن يكون لديها مناهج ملموسة بل مجرد إعلانات للمناهج أي أسماء هذه المناهج (مناهج الواجهة لا يمكن أن يكون لها الجسم). السماح بتعدد المواريث Multiple inheritances. فقط الحقول المعرفت بالثابتة static والنهائية final التي يمكن أن تظهر في الواجهة.
الإعلانات الثابتة = constant declarations
توقيع المنهج = method signature
متغير = variable
الثابتة = static
النهائية = final




لماذا نستخدم الواجهة في جافا


بما أن جافا لا تسمح بتعدد المواريث Multiple inheritances يمكن للمطورين استخدام الواجهات كحل لذلك، من خلال تنفيذ الواجهات. ولا يمكن لفئة في جافا ان تمتد الا من فئة واحدة، ولكن يمكنها ان تنفذ أي عدد من الواجهات.

الفرق بين الفئة المجردة Abstract class و الواجهة Interface

الفرق بين الفئة المجردة  و الواجهة، هو أن في الفئة مجردة يمكن أن يكون لدينا مناهج ملموسة بالإضافة إلى الإعلان على المناهج المجردة، ولكن في الواجهة لدينا فقط الإعلان على المناهج.

الفئة المجردة Abstract class
الواجهة Interface
لا يمكننا إنشاء كائن
لا يمكننا إنشاء كائن
أن الفئة الموروثة من فئة مجردة يجب أن يكون لها جميع المناهج مجردة من هذه الفئة مجردة.
الفئات التي تنفذ واجهة يجب أن تحتوي على جميع المناهج الموجودة في هذه الواجهة.
الفئة المجردة يمكن أن تحتوي على مناهج ملموسة (مناهج الفئة المجردة يمكن أن يكون لها جسم)
الواجهات لا يمكن أن تحتوي على مناهج ملموسة (مناهج الواجهة لا يمكن أن يكون لها جسم)
مناهج مجردة + مناهج ملموسة (يكون لها الجسم)
فقط إعلانات المناهج أي أسماء هذه المناهج (مناهج الواجهة لا يمكن أن يكون لها الجسم)
لا يمكنك استخدامها لفئة سبق توريثها
يمكنك استخدامها لفئة سبق توريثها
ككل الفئات في جافا، الوراثة المتعددة Multiple inheritance لا يسمح بها أيضا مع الفئات المجردة.
الوراثة المتعددة Multiple inheritance مسموح بها

جميع المناهج في الواجهة، ضمنيا تعد عامة public   و مجردة abstract
يمكن لفئة ان تمتد من فئة واحدة فقط، ولكن يمكنها تنفيذ أي عدد من واجهات
يمكن لواجهة أن تمتد من واجهة واحد أو عدة واجهات.
على عكس الواجهات، الفئات المجردة يمكن أن تحتوي على حقول  ليست ثابتة static  و ليست نهائية final.
الحقول الثابتة static والنهائية final فقط التي يمكن أن تظهر في الواجهة.