جوهر الواجهة - الواجهة هي فئة مجردة خاصة تحتوي هذه الفئة المجردة فقط على تعريف الثوابت والأساليب، دون تنفيذ المتغيرات والأساليب.
يمكن أن تحتوي الواجهات على بعض الأشياء التي تحتوي عليها الفئات المجردة. إذا كانت جميع الأساليب الموجودة في فئة مجردة مجردة، فلن تحتاج هذه الفئة المجردة إلى تنفيذ أي طريقة، وجميع المتغيرات في هذه الفئة المجردة هي متغيرات ثابتة، وكلها متغيرات لا يمكن تنفيذها يمكن تغييرها (نهائيًا) في هذا الوقت، ويمكن تعريف هذه الفئة المجردة على أنها واجهة. تنسيق تعريف فئة كواجهة هو استبدال فئة الكلمة الأساسية التي تعلن عن الفئة بواجهة الكلمة الأساسية التي تعلن عن الواجهة.
الواجهة هي فئة مجردة خاصة. في هذه الفئة المجردة، جميع الأساليب هي طرق مجردة، ويتم الإعلان عن السمات (أي متغيرات الأعضاء) لهذه الفئة المجردة على أنها "أسماء سمات النوع النهائي الثابت العام" وبهذه الطريقة، يكون الإعلان الافتراضي هو "نهائي ثابت عام"، أي أن متغيرات الأعضاء الموجودة بالداخل عامة وثابتة ولا يمكن تغييرها. لذلك، عند الإعلان عن ثابت في الواجهة، يمكنك كتابته في شكل "اسم ثابت من النوع النهائي الثابت العام = قيمة (قيمة)"، أو يمكنك كتابته مباشرة في شكل "اسم ثابت من النوع = قيمة (قيمة) )" مثل: "معرف int النهائي العام الثابت = 10" يمكن كتابته مباشرة في شكل "int id = 10"، لأن إعلانات الخصائص الافتراضية في الواجهة كلها "نهائي ثابت عام"، لذلك "نهائي ثابت عام" "يمكن الاستغناء عنها. لا يلزم تعريف الطريقة المجردة المعلنة في الواجهة بواسطة الكلمة الأساسية المجردة، لأن جميع الطرق في الواجهة مجردة، لذلك يتم حذف الكلمة الأساسية "المجردة" افتراضيًا، على سبيل المثال، إذا قمت بتعريف مثل هذه الكلمات الثلاث في الواجهة الأساليب: "بدء الفراغ العام ()" ، "تشغيل الفراغ العام ()" ، "الفراغ العام" لم يتم تحديد "stop ()" بواسطة الكلمة الأساسية المجردة أمام هذه الطرق الثلاثة، ولكنها طرق مجردة، لأن الطرق المعلنة في الواجهة كلها طرق مجردة، لذلك سيتم حذف الكلمة الأساسية المجردة في الطرق المجردة في تم إسقاط الواجهة، لأن الطرق المعلنة افتراضيًا مجردة ، لذلك ليست هناك حاجة لكتابة كلمة "مجردة". وهذا يختلف عن الإعلان عن الأساليب المجردة في الفئات المجردة. عند الإعلان عن الأساليب المجردة في الفئات المجردة، يجب عليك استخدام الكلمة الأساسية "مجردة"، وفي الواجهات يمكنك حذف ". مجردة" عند الإعلان عن الأساليب المجردة. ملحوظة: الطريقة المجردة المعلنة في الواجهة هي "عامة" بشكل افتراضي، ويمكن أن تكون "عامة" فقط. والسبب في إعلانها بهذه الطريقة هو تصحيح المشكلات التي تحدث بسهولة عند حدوث وراثة متعددة في لغة C++ في C++ عرضة للمشاكل. المشكلة هي أنه إذا كانت الفئات الأصلية المتعددة الميراث لها نفس متغيرات الأعضاء، فسيكون من الصعب جدًا الرجوع إليها، وستحدث مشكلات مختلفة أثناء التشغيل. من أجل تصحيح هذه المشكلة، قامت JAVA بتغيير جميع متغيرات الأعضاء في الواجهة إلى نهائي ثابت. إذا كان متغير العضو من النوع الثابت، فإن متغير العضو ينتمي إلى الفئة بأكملها، بدلاً من أن يكون حصريًا لكائن معين. بالنسبة للوراثة المتعددة، يحتوي كائن الفئة الفرعية بالفعل على كائنات فئة أصل متعددة، بينما بالنسبة للوراثة الفردية، يوجد كائن فئة أصل واحد فقط في كائن الفئة الفرعية. تحتوي كائنات الفئات الفرعية المتعددة الموروثة على كائنات فئة أصلية متعددة، وقد تكون هناك متغيرات أعضاء مكررة بين كائنات الفئة الأصلية هذه، وهو ما يكون عرضة للمشاكل جدًا، لذلك يمكن تجنب هذه المشكلة في JAVA باستخدام الواجهات المستخدمة لتنفيذ الوراثة المتعددة. كواجهة، يمكن للفئة أن ترث من الواجهة (أو تنفذ الواجهة)، وهذا أيضًا وراثة متعددة، ولا تقتصر متغيرات الأعضاء في الواجهة على كائن معين، فهي كلها متغيرات أعضاء ثابتة وتنتمي إلى الفئة بأكملها لذلك، لا يهم إذا كان الفصل يطبق واجهات متعددة، ولن يكون هناك تعارض بين الكائنات. يؤدي تنفيذ واجهات متعددة أيضًا إلى تحقيق وراثة متعددة وتجنب المشكلات المعرضة للوراثة المتعددة. وهذه هي فائدة استخدام الواجهات لتنفيذ الوراثة المتعددة.
1. تحديد الواجهة
استخدم الواجهة لتحديد الواجهة. تتشابه تعريفات الواجهة مع التعريفات المشابهة، كما أنها مقسمة إلى إعلانات الواجهة وهيئات الواجهة. ويتكون جسم الواجهة من جزأين: التعريف الثابت وتعريف الطريقة. التنسيق الأساسي لتعريف الواجهة هو كما يلي:
[المعدل] اسم واجهة الواجهة [يوسع قائمة أسماء الواجهة الأصلية]{
[عام] [ثابت] [نهائي] ثابت؛
الطريقة [العامة] [المجردة]؛
}
المعدل: اختياري، يستخدم لتحديد إذن الوصول للواجهة، والقيمة الاختيارية عامة. إذا تم حذفها، يتم استخدام أذونات الوصول الافتراضية.
اسم الواجهة: معلمة مطلوبة، تُستخدم لتحديد اسم الواجهة. يجب أن يكون اسم الواجهة معرف Java قانونيًا. بشكل عام، الحروف الكبيرة مطلوبة.
يمتد: قائمة أسماء الواجهة الأصلية: معلمة اختيارية، تستخدم لتحديد الواجهة الأصلية التي ترث منها الواجهة التي سيتم تعريفها. عند استخدام الكلمة الأساسية الممتدة، يكون اسم الواجهة الأصلية هو المعلمة المطلوبة.
الأساليب: يتم تعريف الأساليب الموجودة في الواجهة فقط ولكن لم يتم تنفيذها.
على سبيل المثال، حدد واجهة للحساب، حيث يتم تحديد PI ثابت وطريقتين، ويكون الكود المحدد كما يلي:
public الواجهة CalInterface { Final float PI=3.14159f;// تحديد PI الثابت المستخدم لتمثيل pi float getArea(float r);// تحديد طريقة لحساب المنطقة getArea() float getCircumference(float r);// تحديد طريقة طريقة getCircumference () لحساب المحيط }
يلاحظ:
مثل ملفات فئة Java، يجب أن يكون اسم الملف الخاص بملف الواجهة هو نفس اسم الواجهة.
2. تنفيذ الواجهة
بعد تعريف الواجهة، يمكن تنفيذها في الفصل الدراسي. لتنفيذ واجهة في الفصل الدراسي، يمكنك استخدام الكلمة الأساسية، وتنسيقها الأساسي هو كما يلي:
[المعدل] الفئة <اسم الفئة> [يمتد اسم الفئة الأصلية] [قائمة واجهة التنفيذ]{
............
}
المعدل: معلمة اختيارية تستخدم لتحديد إذن الوصول للفئة، والقيم الاختيارية عامة ومجردة ونهائية.
اسم الفئة: معلمة مطلوبة، تُستخدم لتحديد اسم الفئة. يجب أن يكون اسم الفئة معرف Java قانونيًا. بشكل عام، الحروف الكبيرة مطلوبة.
توسيع اسم الفئة الأصل: معلمة اختيارية، تُستخدم لتحديد الفئة الأصلية التي يرث منها الفصل الذي سيتم تعريفه. عند استخدام الكلمة الأساسية الممتدة، يكون اسم الفئة الأصل معلمة مطلوبة.
قائمة واجهة التنفيذ: معلمة اختيارية تستخدم لتحديد الواجهات التي تنفذها هذه الفئة. عند استخدام الكلمة الأساسية للأدوات، تكون قائمة الواجهة بمثابة معلمة مطلوبة. عندما تكون هناك أسماء واجهات متعددة في قائمة الواجهات، افصل بينها بفواصل.
عند تنفيذ واجهة في فئة ما، يجب أن يكون اسم الطريقة ونوع قيمة الإرجاع وعدد ونوع المعلمات متطابقين تمامًا مع تلك الموجودة في الواجهة، ويجب تنفيذ جميع الطرق في الواجهة. على سبيل المثال، اكتب فئة باسم Cire تنفذ الواجهة "حساب" المحددة في القسم 5.7.1، ويكون الكود المحدد كما يلي:
public class Cire Implements CalInterface { public float getArea(float r) { float Area=PI*r*r;// احسب مساحة الدائرة وقم بتعيينها لمنطقة الإرجاع المتغيرة;// قم بإرجاع منطقة الدائرة المحسوبة} public float getCircumference (float r) { floatcircference=2*PI*r; // احسب محيط الدائرة وخصصه للمحيط المتغير return محيط; // إرجاع المحيط المحسوب} public static void main(String[] args) { Cire c = new Cire();
في وراثة الفئة، يمكن تنفيذ وراثة واحدة فقط، ولكن عند تنفيذ واجهة، يمكن تنفيذ واجهات متعددة في وقت واحد، ويتم فصل كل واجهة بفاصلة "،".
في هذا الوقت، قد يحدث تعارض في أسماء الثابت أو الأسلوب (في واجهات متعددة). عند حل هذه المشكلة، في حالة تعارض الثوابت، تحتاج إلى تحديد واجهة الثابت بشكل صريح، ويمكن تحقيق ذلك من خلال "اسم الواجهة. ثابت". في حالة حدوث تعارض في الطريقة، ستحتاج فقط إلى تنفيذ طريقة واحدة.