عندما يتحدث البعض عن نموذج الميراث Java OOP، فإنهم عادةً ما يقصدون توسيع فئة الأصل مع وريث، فئة فرعية. ومع ذلك، عندما تصادف الكلمة الأساسية التي تنفذ Java، فهذا يعني أننا ننتقل إلى مستوى آخر من التجريد ونبدأ العمل مع الواجهات في Java. سنتحدث عن ماهية الواجهات والغرض منها وكيف يحدث التنفيذ.

ما هي الواجهة والتنفيذ

ربما سمعت كلمة "واجهة" عدة مرات. على سبيل المثال، يحتوي الكمبيوتر على واجهة إدخال (الماوس ولوحة المفاتيح)، والعديد من البرامج لديها واجهات مستخدم. بالمعنى الأوسع، الواجهة هي رابط بين طرفين متفاعلين. على سبيل المثال، نفس لوحة المفاتيح أو جهاز التحكم عن بعد الخاص بالتلفزيون. في البرمجة، وفي Java على وجه الخصوص، الواجهة عبارة عن عقد محدد ينص على ما ستفعله الفئة التي تنفذها. الواجهة تحدد السلوك فقط. لا يذكر أي شيء عن الكائن الذي سينفذه. يمكنك إعلان واجهة في Java مثل هذا:
public interface MyInterface  {

     // constants declaration
     // methods without implementation
     // static methods
     // default methods (default)
     // private methods
}
فيما يلي بناء جملة التطبيقات في Java:
public class MyClass implements MyInterface{
//implementing the methods of MyInterface
//Other code
}
تصف الواجهة السلوك دون تحديده. على سبيل المثال، يمكن تطبيق سلوك مثل "الحركة" على أنواع مختلفة من الكائنات: دراجة، شخص، سيارة، ماء في النهر، وما إلى ذلك. يمكن أن يكون سلوك السباحة هو سلوك البطة أو السفينة أو السمكة. لا يوجد شيء مشترك بين هذه الكائنات سوى أنها تستطيع التحرك أو السباحة. نعم، والحركة مع السباحة مختلفة تماما. ومع ذلك، في Java، يمكنك إنشاء فئات Duck و Boat و Fish والسماح لهم بتنفيذ القدرة على السباحة. هذا هو المكان الذي يتم فيه استخدام الكلمة الأساسية Java Implements .

تنفيذ مثال للكلمات الرئيسية

public interface Swimmable {

   void moveForward();
   void TurnRight();
   void TurnLeft();

}
كما ترون، لم يتم تنفيذ الأساليب نفسها. لكننا أعلنا أن الفئات التي تطبق هذه الواجهة يجب أن تكون قادرة على السباحة في خط مستقيم، وكذلك الانعطاف يمينًا ويسارًا. لنقم بإنشاء فئات من شأنها تنفيذ هذه الواجهة.
public class Duck implements Swimmable {
//implementing the methods
   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

}

public class Fish implements Swimmable {

   public void moveForward() {
       System.out.println("I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft() {
       System.out.println("I am turning left...");
   }

   public void turnUp(){
       System.out.println("I am turning up...");
   }

   public void turnDown(){
       System.out.println("I am turning down...");
   }

   public void Stop() {
       System.out.println("I am relaxing somewhere under the water surface...");
   }
}
يجب أن تكون جميع الفئات التي تطبق واجهة Swimmable ، وفقًا للعقد، قادرة على السباحة للأمام (تنفيذ طريقة moveForward() )، وكذلك الانعطاف يمينًا ويسارًا. مطلوب تنفيذ هذه الأساليب. البطة والسمكة تسبحان بشكل مختلف. لنفترض أن السمكة لديها طريقتان إضافيتان لتنفيذ قدرتها على السباحة لأعلى ولأسفل. لا تحتوي الواجهة القابلة للسباحة على هذا. ومع ذلك، إذا أنشأنا طفلًا من فئة الأسماك، على سبيل المثال، سمك التونة أو السلمون، فإنه، مثل كل "سمكة"، سيكون قادرًا على السباحة لأعلى ولأسفل.

واجهات متعددة في جافا

كما تعلم، جافا لا تدعم الوراثة المتعددة. وهذا يعني أنه يمكن وراثة فئة واحدة من فئة فائقة واحدة فقط. ومع ذلك، لا يزال بإمكانك استخدام "الميراث المتعدد" في Java، لأن الفصل يمكنه تنفيذ واجهات متعددة.
To implement multiple interfaces, use the next syntax:
interface MyFirstInterface {
   public void myMethod();
}
interface MySecondInterface {
   public void myOtherMethod();
}

// MyClass implements both MyFirstInterface and MySecondInterface
class MyClass implements MyFirstInterface, MySecondInterface {
   public void myMethod() {
      //method implementation
   }
   public void myOtherMethod() {
     //method implementation
   }
}

مثال على واجهات متعددة

تذكر أن البطة لا تستطيع السباحة فحسب، بل يمكنها الطيران أيضًا. دعونا نكتب واجهة الطيران وننفذها في بطتنا.
public interface Flyable {
   double startAge = 0.1;
   void fly();
}

public class Duck implements Swimmable, Flyable {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
ومرة أخرى، من المهم أن نتذكر سبب كتابتنا للواجهة. لنفترض أنه إذا تم تنفيذها بواسطة طائر أو طائرة أو قافز مظلي أو الهندباء، فإن رحلاتهم ستكون مختلفة تمامًا.