خاصية Interface (الواجهة) في لغة جافا هي مفهوم برمجي قوي يسمح بتحديد مجموعة من الطرق (methods) بدون تحديد كيفية تنفيذ هذه الطرق. بمعنى آخر، الواجهة تحدد "عقدًا" يجب على أي صنف (class) "يُنفذ" (implements) هذه الواجهة أن يلتزم به، أي يجب عليه توفير تعريفات (implementations) لجميع الطرق المُعلنة في الواجهة.
شرح مُفصل:
-
تعريف الواجهة: يتم تعريف الواجهة باستخدام الكلمة المفتاحية
interface
، ويتبعها اسم الواجهة، ثم يتم وضع تعريفات الطرق داخل أقواس معقوفة{}
. لا تحتوي الطرق في الواجهة على أي جسم (body)، أي لا يوجد بها كود تنفيذي.Javainterface Drawable {void draw(); // طريقة بدون تنفيذint getNumberOfSides(); // طريقة أخرى بدون تنفيذ} -
تنفيذ الواجهة: يمكن لصنف أن "يُنفذ" واجهة باستخدام الكلمة المفتاحية
implements
. يجب على الصنف الذي يُنفذ واجهة أن يُوفر تعريفًا (implementation) لكل طريقة مُعلنة في الواجهة.Javaclass Circle implements Drawable {@Overridepublic void draw() {System.out.println("Drawing a circle");}@Overridepublic int getNumberOfSides() {return 0; // الدائرة ليس لها أضلاع}}class Square implements Drawable {@Overridepublic void draw() {System.out.println("Drawing a square");}@Overridepublic int getNumberOfSides() {return 4;}} -
فوائد استخدام الواجهات:
-
تحقيق التجريد (Abstraction): تُمكن الواجهات من فصل تعريف الطريقة عن تنفيذها، مما يُحسن من تصميم البرنامج ويجعله أكثر مرونة وقابلية للصيانة.
-
تحقيق تعدد الأشكال (Polymorphism): يُمكن التعامل مع الكائنات من أنواع مختلفة (التي تُنفذ نفس الواجهة) بطريقة موحدة. ففي المثال السابق، يُمكن التعامل مع كائنات
Circle
وSquare
على أنها كائنات من نوعDrawable
.JavaDrawable d = new Circle(); // يُمكن الإشارة إلى كائن Circle كـ Drawabled.draw(); // سيتم استدعاء طريقة draw الخاصة بـ Circled = new Square(); // يُمكن الإشارة إلى كائن Square كـ Drawabled.draw(); // سيتم استدعاء طريقة draw الخاصة بـ Square -
تجنب مشكلة الوراثة المتعددة (Multiple Inheritance): لا تدعم جافا الوراثة المتعددة من الأصناف (class)، ولكنها تسمح للصنف بتنفيذ أكثر من واجهة، مما يُحقق بعض فوائد الوراثة المتعددة بدون تعقيداتها.
-
إنشاء عقود بين الكائنات: تُحدد الواجهات "عقدًا" يجب على الأصناف الالتزام به، مما يُسهل عملية تطوير البرامج الجماعية.
-
-
بعض النقاط الهامة حول الواجهات:
- جميع الطرق في الواجهة افتراضياً
public
وabstract
. - يُمكن للواجهة أن تحتوي على ثوابت (constants) وهي افتراضياً
public
,static
, وfinal
. - بدءًا من Java 8، يُمكن للواجهات أن تحتوي على طرق افتراضية (default methods) ولها تنفيذ افتراضي، وطرق ثابتة (static methods).
- جميع الطرق في الواجهة افتراضياً
مثال شامل:
interface Shape { double getArea(); double getPerimeter();}
class Rectangle implements Shape { private double length; private double width;
public Rectangle(double length, double width) { this.length = length; this.width = width; }
@Override public double getArea() { return length * width; }
@Override public double getPerimeter() { return 2 * (length + width); }}
public class Main { public static void main(String[] args) { Rectangle r = new Rectangle(5, 10); System.out.println("Area: " + r.getArea()); System.out.println("Perimeter: " + r.getPerimeter()); }}
في هذا المثال، تُحدد الواجهة Shape
طريقتين لحساب المساحة والمحيط. يُنفذ الصنف Rectangle
هذه الواجهة ويُوفر تعريفات لهذه الطرق.
باختصار، تُعتبر الواجهات أداة قوية في جافا تُساعد على كتابة برامج مرنة وقابلة للتطوير والصيانة.