English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
أضاف Java 8 طرق الواجهة الافتراضية.
بشكل بسيط، الطريقة الافتراضية هي أن الواجهة يمكن أن تحتوي على طرق، وأن لا تحتاج الفئة المحددة إلى تنفيذ هذه الطرق.
لإجراء الطريقة الافتراضية، يكفي فقط إضافة كلمة default قبل اسم الطريقة.
لماذا نحتاج إلى هذه الخاصية؟
الواجهة السابقة كانت سيفاً ذو حدين، الجانب الإيجابي هو التوجه نحو الت抽象 بدلاً من التوجه نحو التمثيل، والنقطة السلبية هي أنك تحتاج إلى تعديل جميع الفئات التي تحقق الواجهة عند الحاجة إلى تعديل الواجهة، في إطار Java قبل Java 8 لم يكن هناك طريقة foreach في مجموعة التجميع، عادةً يمكن التفكير في حل هو إضافة طريقة جديدة وإجراءها في JDK. ومع ذلك، فإنه لا يمكن إضافة طريقة جديدة إلى الواجهة دون تأثير على التنفيذ الحالي. لذلك تم تقديم الطرق الافتراضية. هدافهم هو حل مشكلة عدم التطابق بين تعديل الواجهة والتنفيذ الحالي.
نموذج جملة الطريقة الافتراضية كالتالي:
public interface Vehicle { default void print(){ System.out.println("أنا سيارة!"); } }
واجهة تحتوي على طريقة افتراضية، لنفترض أن هناك حالة حيث قام فئة واحدة بتطبيق عدة واجهات ولديها طرق افتراضية متشابهة، على سبيل المثال:
public interface Vehicle { default void print(){ System.out.println("أنا سيارة!"); } } public interface FourWheeler { default void print(){ System.out.println("أنا سيارة أربعة عجلات!"); } }
حلول أولى هي إنشاء طريقة افتراضية خاصة بك لتغطية تعديل الطريقة الافتراضية الخاصة بالواجهة:
public class Car implements Vehicle, FourWheeler { default void print(){ System.out.println("أنا سيارة أربعة عجلات!"); } }
حلول ثاني يمكن استخدامه super للإتصال بالطريقة الافتراضية الخاصة بالواجهة المحددة:
public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); } }
واحدة من خصائص Java 8 هي أن يمكن للواجهات أن تُعلن (ويمكنها تقديم) طرق ثابتة. على سبيل المثال:
public interface Vehicle { default void print(){ System.out.println("أنا سيارة!"); } // طريقة ثابتة static void blowHorn(){ System.out.println("أنقر على الصافرة!!!"); } }
يمكننا فهم استخدام الطرق الافتراضية من خلال الأتي من خلال وضع الكود في ملف Java8Tester.java:
public class Java8Tester { public static void main(String args[]){ Vehicle vehicle = new Car(); vehicle.print(); } } interface Vehicle { default void print(){ System.out.println("أنا سيارة!"); } static void blowHorn(){ System.out.println("أنقر على الصافرة!!!"); } } interface FourWheeler { default void print(){ System.out.println("أنا سيارة أربعة عجلات!"); } } class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); FourWheeler.super.print(); Vehicle.blowHorn(); System.out.println("أنا سيارة!"); } }
ت�行 الوسائط أعلاه، الناتج هو:
$ javac Java8Tester.java $ java Java8Tester أنا سيارة! أنا سيارة أربعة عجلات! أنقر على الصافرة!!! أنا سيارة!