واجهة (جافا)
الواجهة في لغة برمجة جافا هي نوع مجرد يُستخدم لتحديد سلوك يجب على الفئات تنفيذه. وهي تُشبه البروتوكولات . تُعلن الواجهات باستخدام الكلمة المفتاحية ` interface` ، وقد تحتوي فقط على توقيعات الدوال وتصريحات الثوابت (تصريحات المتغيرات التي تُعرّف على أنها `interface` و` interface`). لا تحتوي جميع دوال الواجهة على تنفيذ (أجسام الدوال) في جميع الإصدارات الأقدم من جافا 8. بدءًا من جافا 8، [ 1 ] : 99 و [ 1 ] : 7 دوال يمكن أن تحتوي على تنفيذ في تعريفها. [ 2 ] ثم، في جافا 9، أُضيفت الدوال `interface` و` interface`. حاليًا، يمكن أن تحتوي واجهة جافا على ما يصل إلى ستة أنواع مختلفة. توجد مثل هذه الواجهات في لغة C# .interfacestaticfinaldefaultstaticinterfaceprivateprivate static
لا يمكن إنشاء مثيلات للواجهات ، بل يتم تنفيذها. يجب على الفئة التي تُنفذ واجهةً ما أن تُنفذ جميع الطرق غير الافتراضية الموصوفة في تلك الواجهة، أو أن تكون فئةً مجردة . يمكن تحديد مراجع الكائنات في جافا لتكون من نوع واجهة؛ وفي كلتا الحالتين، يجب أن تكون إما فارغة (null )، أو مرتبطة بكائن يُنفذ تلك الواجهة.
إحدى فوائد استخدام الواجهات هي أنها تحاكي الوراثة المتعددة . يجب أن تحتوي جميع الفئات في جافا على فئة أساسية واحدة فقط ، باستثناء الفئة الجذريةjava.lang.Object لنظام أنواع جافا ؛ ولا يُسمح بالوراثة المتعددة للفئات. مع ذلك، يمكن للواجهة أن ترث عدة واجهات، ويمكن للفئة أن تُنفذ عدة واجهات.
ملخص
تُستخدم الواجهات لترميز أوجه التشابه بين فئات الأنواع المختلفة، ولكنها لا تُشكل بالضرورة علاقة بين الفئات. على سبيل المثال، يستطيع كل من الإنسان والببغاء التصفير ؛ ومع ذلك، لا يُعقل تمثيل كل منهما كفئتين فرعيتين من فئة واحدة. بل من المرجح أنهما فئتان فرعيتان من فئة واحدة (مع وجود فئات وسيطة على الأرجح)، ولكن كليهما يُطبق الواجهة.HumanParrotWhistlerAnimalWhistler
من الاستخدامات الأخرى للواجهات إمكانية استخدام كائن دون معرفة نوعه، بل فقط أنه يُطبّق واجهة معينة. على سبيل المثال، إذا انزعج شخص ما من صوت صفير، فقد لا يعرف ما إذا كان إنسانًا أم ببغاءً، لأن كل ما يمكن تحديده هو أن هناك صفيرًا. سيستدعي الاستدعاء whistler.whistle()الطريقة المُطبّقة whistleللكائن whistlerبغض النظر عن نوعه، شريطة أن يُطبّق الواجهة. Whistlerفي مثال عملي أكثر، قد تتوقع خوارزمية فرز كائنًا من نوع معين Comparable. وبالتالي، دون معرفة النوع المحدد، تعرف الخوارزمية أنه يمكن فرز الكائنات من هذا النوع بطريقة ما.
على سبيل المثال:
واجهة قابلة للارتداد { عدد عشري باي = 3.1415 ؛// لاحظ الفاصلة المنقوطة // دوال الواجهة عامة، مجردة، وليست نهائية أبدًا. // عادةً ما تُستخدم كنماذج أولية، ولكن يُسمح بالتنفيذات الافتراضية void setBounce (); }واجهة:
الاستخدام
تحديد واجهة
يتم تعريف الواجهات باستخدام الصيغة التالية (قارن بتعريف فئة جافا ):
[ الرؤية ] واجهة InterfaceName [تمتد إلى واجهات أخرى ] { تعريفات الثوابت، تعريفات الأساليب المجردة، تعريفات الأساليب الثابتة }مثال:
public interface Interface1 extends Interface2 , Interface3 , Interface4 ;يحتوي جسم الواجهة على توابع مجردة ، ولكن بما أن جميع التوابع في الواجهة مجردة بحكم تعريفها، فإن abstractالكلمة المفتاحية غير مطلوبة. ولأن الواجهة تحدد مجموعة من السلوكيات المعروضة، فإن جميع التوابع مجردة ضمنيًا public.
وبالتالي، قد تكون الواجهة البسيطة
واجهة عامة Predator { منطقي chasePrey ( Prey p ); فارغ eatPrey ( Prey p ); }تكون تعريفات أنواع الأعضاء في الواجهة ثابتة ونهائية وعامة ضمنيًا، ولكن بخلاف ذلك يمكن أن تكون أي نوع من أنواع الفئات أو الواجهات. [ 3 ]
تطبيق الواجهات في فئة
تستخدم صيغة تنفيذ الواجهة هذه الصيغة:
... تُنفذ اسم الواجهة [، واجهة أخرى ، أخرى ، ...] ...
قد تُطبّق الفئات واجهةً ما. على سبيل المثال:
public class Lion extends Animal implements Predator { @Override public boolean chasePrey ( Prey p ) { // برمجة لمطاردة الفريسة p (خاصةً أسد) }@Override public void eatPrey ( Prey p ) { // برمجة لأكل الفريسة p (خاصةً أسد) } }إذا قامت فئة بتنفيذ واجهة ولم تُنفذ جميع توابعها، فيجب وضع علامة عليها بأنها فارغة abstract. أما إذا كانت الفئة مجردة، فمن المتوقع أن تقوم إحدى فئاتها الفرعية بتنفيذ توابعها غير المنفذة، ولكن إذا لم تقم أي من الفئات الفرعية للفئة المجردة بتنفيذ جميع توابع الواجهة، فيجب وضع علامة على الفئة الفرعية نفسها بأنها فارغة abstract.
يمكن للفئات تطبيق واجهات متعددة:
public class Frog extends Animal implements Predator , Prey { // ... }يمكن للواجهات أن تشترك في أساليب الفئات المشتركة:
فئة مجردة باسم Animal تُنفذ واجهتي LikesFood و LikesWater { دالة منطقية likes () { تُرجع القيمة true ; } }ومع ذلك، لا يمكن لفئة معينة أن تنفذ نفس الواجهة أو واجهة مشابهة عدة مرات:
// خطأ: واجهة مكررة ، فئة مجردة Animal تُنفذ Shares <Boolean> و Shares <Integer> ... { // ... }تُستخدم الواجهات بشكل شائع في لغة جافا لوظائف الاستدعاء ، [ 4 ] حيث لا تسمح جافا بتعدد وراثة الفئات، ولا تسمح بتمرير الدوال (الإجراءات) كوسائط. لذلك، لتمرير دالة كمعامل إلى دالة مستهدفة، تتمثل الممارسة الحالية في تعريف وتمرير مرجع إلى واجهة كوسيلة لتوفير توقيع وعنوان دالة المعامل للدالة المستهدفة، بدلاً من تعريف متغيرات متعددة للدالة المستهدفة لتناسب كل فئة مستدعِية محتملة.
الواجهات الفرعية
يمكن للواجهات أن تمتد إلى عدة واجهات أخرى، باستخدام نفس الصيغة الموضحة أدناه. على سبيل المثال،
public interface VenomousPredator extends Predator , Venomous { // جسم الواجهة }يُعدّ هذا قانونيًا ويُعرّف واجهة فرعية. يسمح هذا النوع من التعريف بالوراثة المتعددة، على عكس الأصناف. Predatorوقد Venomousيُعرّف أو يرث أساليب بنفس التوقيع، على سبيل المثال kill(Prey p). عندما يُنفّذ صنفٌ ما واجهةً فرعية، VenomousPredatorفإنه سيُنفّذ كلا الأسلوبين في آنٍ واحد.
أمثلة
بعض واجهات جافا الشائعة هي:
Comparableيحتوي على الطريقةcompareToالتي تُستخدم لوصف كائنين بأنهما متساويان، أو للإشارة إلى أن أحدهما أكبر من الآخر. تسمح الأنواع العامة للفئات المُنفذة بتحديد مثيلات الفئات التي يمكن مقارنتها بها.Serializableهي واجهة تعريفية بدون دوال أو حقول - جسمها فارغ. تُستخدم للإشارة إلى إمكانية تسلسل فئة ما . يصف توثيق جافا الخاص بها كيفية عملها، مع العلم أنه لا يوجد أي شيء مفروض برمجيًا.
انظر أيضاً
الاقتباسات
- 1 2 3 4 بلوخ 2018 .
- ↑ "الأساليب الافتراضية" . مؤرشف من الأصل بتاريخ 23-05-2017 . تم الاطلاع عليه بتاريخ 30-06-2014 .
- ↑ "مواصفات لغة جافا" .
- ↑ ميتشل، جون د. (1 يونيو 1996). "نصيحة جافا رقم 10: تنفيذ إجراءات رد الاتصال في جافا" . جافا وورلد . تم الاسترجاع في 14 يوليو 2020 .
مراجع
- بلوخ، جوشوا (2018). "جافا الفعّالة: دليل لغة البرمجة" ( الطبعة الثالثة). أديسون-ويسلي. ISBN 978-0134685991.
روابط خارجية
- جافا (لغة برمجة)
- واجهات
