في التغليف والواجهات، تقوم الكلمة الأساسية الخاصة بتغليف الأعضاء الداخليين للكائن. بعد التغليف، يخفي المنتج التفاصيل الداخلية ويوفر واجهة المستخدم فقط.
تعد الواجهة مفهومًا مفيدًا جدًا يمكن أن يساعدنا في التفكير المجرد. في الحياة الواقعية، عندما نفكر في جهاز معين، غالبًا ما نفكر في الواجهة الوظيفية للجهاز. على سبيل المثال، مع الكوب، نفكر في إمكانية إضافة الماء وماء الشرب أكثر من تفكيرنا في مادة الكوب وسعره. وبعبارة أخرى، إلى حد ما، فإن واجهة الجهاز تعادل الجهاز نفسه. تم تجاهل التفاصيل الداخلية من عملية التفكير.
كوب في الاعتبار
في آليات التغليف العامة والخاصة، نقوم بالفعل بتعريف الفئات والواجهات في نفس الوقت، ويتم خلط الفئات والواجهات معًا. توفر Java أيضًا بناء جملة الواجهة. يفصل بناء الجملة هذا الواجهة عن التعريف المحدد للفئة ويشكل جسمًا مستقلاً.
واجهة
بأخذ الكوب كمثال، حدد واجهة الكوب:
انسخ رمز الكود كما يلي:
واجهة كأس {
void addWater(int w);
مشروب باطلة(int w);
}
تحدد واجهة Cup النماذج الأولية لطريقتين: addWater() و DrinkWater(). يحدد النموذج الأولي للطريقة اسم الطريقة وقائمة المعلمات ونوع الإرجاع. يمكن للنماذج الأولية أن تخبر العالم الخارجي بكيفية استخدام هذه الأساليب.
في الواجهة نحن
1. لا حاجة لتحديد نص الطريقة
2. ليست هناك حاجة لتحديد إمكانية رؤية الطريقة
لاحظ النقطة الثانية، الطرق الموجودة في الواجهة عامة بشكل افتراضي. كما ذكرنا في التغليف والواجهات، فإن الطرق العامة للفئة تشكل واجهة. لذلك، تكون كافة الأساليب التي تظهر في الواجهة عامة بشكل افتراضي.
يمكننا تنفيذ الواجهة في تعريف الفصل، مثل MusicCup أدناه (كوب يمكنه تشغيل الموسيقى):
انسخ رمز الكود كما يلي:
فئة MusicCup تنفذ الكأس
{
addWater الفراغ العام (int w)
{
this.water = this.water + w;
}
مياه الشرب الفراغية العامة (int w)
{
this.water = this.water - w;
}
المياه الدولية الخاصة = 0؛
}
نحن نستخدم الكلمة الأساسية للتنفيذ لتنفيذ الواجهة. بمجرد تنفيذ الواجهة في الفصل الدراسي، يجب تحديد كافة أساليب الواجهة (addWater() و DrinkWater()) في الفصل. تحتاج الأساليب الموجودة في الفصل إلى مطابقة النماذج الأولية للطرق في الواجهة. وإلا، ستبلغ Java عن خطأ.
يمكن تعريف الطرق العامة الأخرى التي لم تذكرها الواجهة في الفصل. بمعنى آخر، تحدد الواجهة الحد الأدنى من الواجهة التي يجب تنفيذها. على سبيل المثال، لا تحدد طريقة waterContent() التالية نموذجًا أوليًا في واجهة Cup:
انسخ رمز الكود كما يلي:
فئة MusicCup تنفذ الكأس
{
addWater الفراغ العام (int w)
{
this.water = this.water + w;
}
مياه الشرب الفراغية العامة (int w)
{
this.water = this.water - w؛
}
المحتوى المائي العام ()
{
إرجاع هذا الماء؛
}
المياه الدولية الخاصة = 0؛
}
معنى واجهات منفصلة
لقد استخدمنا واجهة، لكن هذه الواجهة لم تقلل من عبء العمل لدينا عند تحديد الفئات. لا يزال يتعين علينا كتابة الفصول الدراسية على وجه التحديد كما كان من قبل. علينا أيضًا أن نكون أكثر حرصًا على عدم انتهاك قواعد الواجهة. في هذه الحالة لماذا نستخدم الواجهة؟
في الواقع، الواجهة تشبه معيار الصناعة. يمكن للمصنع (الفئة) اعتماد معايير الصناعة (واجهة التنفيذ) أم لا. ومع ذلك، فإن المنتج الذي يعتمد معايير الصناعة سيكون له الفوائد التالية:
1. جودة أعلى: الأكواب التي لا تحتوي على وظيفة إضافة الماء لا تلبي المعايير.
2. ترويج أسهل: تمامًا مثل واجهة USB الموجودة على الكمبيوتر، يمكن توصيل المنتجات النهائية بسهولة أكبر.
إذا كان لدينا بالفعل برنامج Java، فسيتم استخدامه لمعالجة الكائنات التي تتوافق مع واجهة Cup، مثل جعل الأطفال يشربون الماء. بعد ذلك، طالما أننا متأكدون من أننا ننفذ واجهة الكوب لكوب الطفل (الكائن)، فيمكننا التأكد من أن الطفل يمكنه القيام بعملية شرب الماء. أما بالنسبة لكيفية تعريف هذا الكوب (الشيء) على وجه التحديد لعمل شرب الماء، فيمكننا أن نترك الأمر للفئة المقابلة ليقررها (مثل الشرب من خلال القشة، أو فتح فم صغير للشرب).
في علوم الكمبيوتر، تعد الواجهة مفهومًا مهمًا جدًا. على سبيل المثال، يمكن تسمية أي نظام تشغيل يوفر واجهة UNIX بنظام UNIX. Linux وMac OS وSolaris كلها أنظمة UNIX وتوفر واجهات مماثلة. ومع ذلك، يختلف التنفيذ المحدد (الكود المصدري) لكل نظام عن الآخر. Linux مفتوح المصدر، ويمكنك عرض كل سطر من التعليمات البرمجية الخاصة به، لكنك لا تزال لا تعرف كيفية برمجة نظام Solaris.
نفس واجهة UNIX
تنفيذ واجهات متعددة
يمكن للفئة تنفيذ أكثر من واجهة واحدة. على سبيل المثال، لدينا الواجهة التالية:
انسخ رمز الكود كما يلي:
واجهة مشغل الموسيقى {
اللعب باطل () ؛
}
دعونا نفكر في فئة MusicCup مرة أخرى. يمكن اعتبار MusicCup بمثابة مزيج من اللاعب والكوب.
لذلك، يجب أن يحتوي MusicCup على مجموعتين من الواجهات، أي تنفيذ واجهة MusicPlayer وواجهة Cup في نفس الوقت:
انسخ رمز الكود كما يلي:
فئة MusicCup تنفذ MusicPlayer، Cup
{
addWater الفراغ العام (int w)
{
this.water = this.water + w;
}
مياه الشرب الفراغية العامة (int w)
{
this.water = this.water - w؛
}
اللعب الفراغي العام ()
{
System.out.println("لا...لا...لا");
}
المياه الدولية الخاصة = 0؛
}
أخيرًا، يمكنك محاولة وضع تعريفات الواجهة والفئة المذكورة في هذه المقالة في نفس الملف، وكتابة فئة الاختبار، وتشغيلها.
تلخيص
واجهة، طريقة الصورة النمطية، العامة
تنفذ واجهة
تنفذ الواجهة 1، الواجهة 2