CodeGym /وبلاگ جاوا /Random-FA /رابط در جاوا
John Squirrels
مرحله
San Francisco

رابط در جاوا

در گروه منتشر شد
همانطور که می دانید، همه چیز در جاوا از اشیاء تشکیل شده است و اشیا دارای حالت (فیلد) و رفتار (تعریف شده توسط متدها) هستند. رفتار یک کلاس چیزی است که می تواند آن را به کلاس های دیگر متصل کند. رفتار می‌تواند ویژگی‌های متفاوتی داشته باشد، و گاهی اوقات انتقال آن به خارج از کلاس راحت‌تر است، به‌ویژه زمانی که صحبت از تعامل با دنیای بیرون می‌شود. درست مانند کنترل از راه دور تلویزیون خارج از خود "جعبه" است. کنترل از راه دور رابطی برای تعامل کاربر با عملکردهای تلویزیون است. به عنوان مثال، می توانید کلاسی را تصور کنید که یک هواپیما یا هلیکوپتر انتزاعی را پیاده سازی می کند. اشیاء هر دو کلاس مانند اکثر پرندگان می توانند پرواز کنند و همه آنها این کار را متفاوت انجام می دهند. شاید ارزش آن را داشته باشد که این ویژگی را به یک موجودیت جداگانه منتقل کنیم و همه "پرنده"های بالقوه از این موجودیت به ارث برده شوند؟ اگر قبلاً با کلاس‌های انتزاعی آشنا هستید، می‌توانید یک کلاس انتزاعی Flyable ایجاد کنید و کلاس‌های Copter و Plane را از آن به ارث ببرید. با این حال، اگر چندین ویژگی از این قبیل وجود داشته باشد، چه؟ به عنوان مثال، هواپیماها و هلیکوپترها می توانند پرواز کنند، اما می توانند روی زمین نیز سفر کنند. حتی اگر کلاس Ride را ایجاد کنیم، دیگر نمی توانیم Copter و Plane را به آن اختصاص دهیم. به هر حال، هر کلاس جاوا فقط یک کلاس والد دارد. رابط در جاوا - 1استفاده از رابط ها در زبان جاوا تا حدودی این مشکل را حل می کند. واسط ها در جاوا برخی از عملکردها را تعریف می کنند که پیاده سازی خاصی ندارند، که سپس توسط کلاس هایی که از این رابط ها استفاده می کنند پیاده سازی می شوند. و یک کلاس می تواند رابط های زیادی را پیاده سازی کند. در واقع با پیاده سازی یک رابط در جاوا، اعلام می کنیم که کلاس ما می تواند کاری را انجام دهد، رفتار آن را گزارش می کنیم. ما قبلاً اجرای دقیق رفتار را در کلاس انجام می دهیم. بنابراین. یک هواپیما و یک هلیکوپتر متفاوت از زمین بلند می شوند: یک هواپیما به باند فرودگاه نیاز دارد، در حالی که یک هلیکوپتر معمولاً به صورت عمودی بلند می شود. چنین جزئیاتی به بهترین وجه در کلاس پیاده سازی می شوند.

رابط ها در جاوا

برای تعریف رابط در زبان جاوا از کلمه کلیدی رابط استفاده می شود. مثلا:
interface Voice {

    void talk();
}
رابط بالا Voice نام دارد . یک رابط در جاوا ممکن است ثابت ها و متدهایی را تعریف کند که ممکن است پیاده سازی داشته باشند یا نداشته باشند. معمولاً متدهای واسط پیاده سازی ندارند، درست مانند این مثال. متدها در رابط‌های بدون پیاده‌سازی مانند متدهای انتزاعی کلاس‌های انتزاعی هستند. روش های رابط معمولاً اصلاح کننده دسترسی ندارند. با این حال دسترسی در واقع به طور پیش فرض عمومی است زیرا هدف یک رابط تعریف عملکرد برای پیاده سازی کلاس است. بنابراین، تمام قابلیت ها باید برای اجرا باز باشد. برای پیاده سازی یک رابط، از کلمه کلیدی Implements هنگام اعلام کلاس خود استفاده کنید. علاوه بر این، اگر یک اینترفیس حاوی متدی بدون پیاده‌سازی باشد، آن متد باید در کلاس پیاده‌سازی پیاده‌سازی شود.
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

نمونه کد رابط

بیایید مثال کامل تری بزنیم. هر (خوب، تقریباً هر) حیوان توانایی ایجاد صدا را دارد. بیایید یک صدای رابط جاوا برای این مورد ایجاد کنیم. این یک متد talk() بدون پیاده سازی دارد .
public interface Voice {
   void talk();
}
اکنون تمام کلاس هایی که از رابط Voice پشتیبانی می کنند باید پیاده سازی متد talk() داشته باشند . بیایید دو کلاس ایجاد کنیم - Cat و Dog و نشان دهیم که آنها رابط Voice را پیاده سازی می کنند . در این صورت، اگر کلاسی را در آن پیاده سازی نکنید، برنامه کار نخواهد کرد. روش های پیاده سازی بسیار ساده است. هنگام فراخوانی متد talk() یک شی از کلاس Cat ، متن معادل میو روی صفحه نمایش داده می شود، در مورد کلاس Dog ، یک پارس. همچنین دریافت کننده، تنظیم کننده و سازنده را به کلاس ها اضافه خواهیم کرد.
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
در واقع، پیاده سازی کلاس ها و روش های ما بسیار شبیه به هم هستند. بیایید کلاس دیگری به نام Parrot با پشتیبانی Voice ایجاد کنیم . فقط متد talk() در آن متفاوت عمل می کند: کاربر یک رشته را در کنسول وارد می کند و طوطی آن را با استفاده از متد talk() تکرار می کند .
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
حالا بیایید یک کلاس تست بسازیم و ببینیم اگر متد talk() اشیاء کلاس های Cat ، Dog و Parrot را به نوبت فراخوانی کنیم، برنامه چه نتیجه ای خواهد داشت .
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
خروجی زیر است. متن سبز یکی از کاربرانی است که در کنسول چاپ شده است.
میو... WOF WOF بعد از تو چی را تکرار کنم؟... من پرنده بسیار پرحرف و باهوش هستم من پرنده بسیار پرحرف و باهوش هستم

روش های پیش فرض

قبل از انتشار JDK 8 هنگام پیاده سازی یک رابط در جاوا، ما مجبور بودیم تمام متدهای آن را در یک کلاس پیاده سازی کنیم. در عین حال، خود رابط جاوا می‌تواند فقط شامل تعاریف متد بدون پیاده‌سازی خاص باشد. JDK 8 قابلیت های جدیدی را اضافه می کند - روش های پیش فرض. اکنون رابط های جاوا می توانند نه تنها تعاریف متد بلکه پیاده سازی های پیش فرض را نیز داشته باشند. اگر کلاس رابط را پیاده سازی کند اما متد را پیاده سازی نکند از آنها استفاده می شود. به عنوان مثال، اجازه دهید متد talk() در رابط Voice را به روش پیش فرض تغییر دهیم. ما همچنین یک کلاس Duck با قابلیت Voice -enabled جدید می نویسیم که پیاده سازی متد گفتگو را ندارد .
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   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!!!");
   }

}
حالا بیایید کلاس آزمایشی خود را کمی تغییر دهیم.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
خروجی اینجاست:
میو... ووف ووف میتونم حرف بزنم...
دیدن؟ در اشیاء کلاس‌های Dog و Cat ، متد overridden talk() فراخوانی می‌شود، اما در یک شی از کلاس Duck ، متد پیش‌فرض از رابط فراخوانی می‌شود. بنابراین، روش پیش فرض فقط یک روش بدون تغییر دهنده است و با کلمه کلیدی پیش فرض مشخص شده است. ما مجبور نیستیم متد پیش فرض را در کلاسی که اینترفیس را پیاده سازی می کند پیاده سازی کنیم، اما می توانیم آن را لغو کنیم.

روش های استاتیک

از آنجایی که روش‌های استاتیک JDK 8 در رابط‌های جاوا در دسترس هستند، آنها مشابه متدهای کلاس هستند:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
برای رجوع به روش ایستا یک اینترفیس، مانند کلاس ها، نام اینترفیس و متد را بنویسید:
public static void main(String[] args) {

    Voice.check();
}

پیاده سازی چندگانه رابط ها

اگر نیاز به اعمال چندین رابط در کلاس جاوا داشته باشیم، همه آنها با یک کاما بعد از کلمه implements فهرست می شوند :
public class Duck implements Swimmable, Flyable, Voice {

    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!!!");
    }

}
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION