جاوا

جلسه ۴۰: اینترفیس ها در جاوا

interface interfaceName {
  
  // Code goes here
  
}

قوانینی که باید رعایت شوند

  • یک رابط می تواند موارد زیر را داشته باشد:
    • متد (های) انتزاعی abstract method(s)
    • متد (های) پیش فرض default method(s)
    • متد (های) ایستا static method(s)
    • متد (های) خصوصی private method(s)
    • متد (های) ایستای خصوصی private static method(s)
    • متغیر عمومی نهایی استاتیک public static final variable(s)
  • تمام متدهای اعلام شده یا پیاده سازی شده در یک اینترفیس به طور پیش فرض عمومی (public) هستند و همه متغیرها به صورت پیش فرض عمومی استاتیک نهایی (public static final) هستند.
  • درست مانند یک کلاس انتزاعی ، یک یانترفیس نمی تواند نمونه سازی شود. یعنی نمی توان شی از آن ساخت.
  • برای استفاده از یک اینترفیس، یک کلاس باید تمام متد (های) انتزاعی اعلام شده در آن را پیاده سازی کند.
  • یک اینترفیس نمی تواند سازنده (ها) در خود داشته باشد.
  • یک کلاس نمی تواند از بیش از یک کلاس مشتق شود ، اما می تواند هر تعداد اینترفیس را پیاده سازی کند.
  • یک اینترفیس می تواند از اینترفیس دیگری مشتق شود.
  • نمی توان یک اینترفیس را خصوصی (private) یا محافظت شده (protected) تعریف کرد.
توجه: یک کلاس از کلمه کلیدی implements برای پیاده سازی یک اینترفیس استفاده می کند اما یک اینترفیس از کلمه کلیدی extends برای گسترش یک اینترفیس دیگر استفاده می کند.

پیاده سازی

در مثال زیر کاربرد اینترفیس را در عمل مشاهده می کنید:
  • یک کلاس پایه به نام Bird یا پرنده
  • یک کلاس مشتق شده به نام Parrot یا طوطی
  • یک کلاس مشتق شده به نام Penguin یا پنگوئن
  • اینترفیسی به نام CanFly

در زیر کد را می بینید:
// Base class Bird
class Bird {   

  // Common trait of all birds so implemented in the base class
  public void eat() { 
    System.out.println(getClass().getSimpleName() + " is eating!");
  }
  
}// End of Bird class

interface CanFly {

  // The method is by default abstract and public
  void flying();   
  
}// End of CanFly interface

class Parrot extends Bird implements CanFly { // Parrot is extending from Bird and implementing CanFly

  @Override               // If you don't implement the flying() you will get an error!
  public void flying() { // Overriding the method of CanFly interface
    System.out.println("Parrot is Flying!");
  }
} // End of Parrot class

class Penguin extends Bird { // Penguin is a bird so extending from Bird
  
  // Penguin cannot fly so not implementing CanFly
  public void walk() {
    System.out.println("Penguin is Walking!");
  }
  
} // End of Penguin class

class Main {

  public static void main(String[] args) {

    Parrot parrot = new Parrot();   // Creating the Parrot object
    Penguin penguin = new Penguin(); // Creating the Penguin object

    parrot.eat();
    parrot.flying();

    System.out.println();    // Just creating a newline on console

    penguin.eat();
    penguin.walk();
    
  } // End of main()
  
} // End of Main class
در کد بالا خط ۱۴ نحوه پیاده سازی اینترفیس را نشان می دهد.

مزایای اینترفیس ها

  • اینترفیس ها به ما امکان می دهند مفهوم انتزاع را به صورت ۱۰۰٪ اجرا کنیم.
  • برای دستیابی به اتصال ضعیف (loose coupling) در برنامه می توان از اینترفیس استفاده کرد. این به این معنی است که تغییر در یک کلاس بر پیاده سازی کلاس دیگر تأثیر نمی گذارد و کلاس ها از هم مستقل اند.
  • با استفاده از اینترفیس ها ، می توان طرح های پیچیده به طرح های کوچکتر تقسیم کرد و وابستگی های بین اشیا را از بین برد.
  • می توان از اینترفیس ها برای دستیابی به وراثت چندگانه استفاده کرد (در جلسه بعدی بحث خواهد شد).
در این جلسه ، موضوع مهم دیگری از انتزاع در جاوا یعنی اینترفیس ها (رابط ها) مورد بررسی قرار می گیرد. موارد زیر را بیان خواهیم کرد:
  • اینترفیس چیست؟
  • نحوه اعلام اینترفیس
  • قوانینی که باید رعایت شوند
  • پیاده سازی
  • مزایای استفاده از اینترفیس ها

اینترفیس چیست؟

اینترفیس دقیقاً مانند یک کلاس است و رفتاری را که یک کلاس باید پیاده سازی کند مشخص می کند.
از یک اینترفیس می توان برای دستیابی به انتزاع ۱۰۰٪ استفاده کرد زیرا شامل امضای متد یا متد انتزاعی (آنچه باید انجام شود) است ونه جزئیات پیاده سازی (نحوه انجام کار) این متدها. به این ترتیب ، اینترفیس ها اصل انتزاع را برآورده می کنند. تکنیک های پیاده سازی متدهای اعلام شده در یک اینترفیس کاملاً به کلاس های پیاده سازی کننده آن اینترفیس بستگی دارد.
می توان یک اینترفیس را همچون قراردادی دانست که یک کلاس باید هنگام پیاده سازی آن اینترفیس انجام دهد. طبق این قرارداد ، کلاسی که یک اینترفیس را پیاده سازی می کند باید تمام متدهای انتزاعی اعلام شده در آن اینترفیس را Override کند.

نحوه اعلام اینترفیس

یک اینترفیس دقیقاً مانند یک کلاس اما با استفاده از کلمه کلیدی interface اعلام می شود:
interface interfaceName {
  
  // Code goes here
  
}

قوانینی که باید رعایت شوند

  • یک رابط می تواند موارد زیر را داشته باشد:
    • متد (های) انتزاعی abstract method(s)
    • متد (های) پیش فرض default method(s)
    • متد (های) ایستا static method(s)
    • متد (های) خصوصی private method(s)
    • متد (های) ایستای خصوصی private static method(s)
    • متغیر عمومی نهایی استاتیک public static final variable(s)
  • تمام متدهای اعلام شده یا پیاده سازی شده در یک اینترفیس به طور پیش فرض عمومی (public) هستند و همه متغیرها به صورت پیش فرض عمومی استاتیک نهایی (public static final) هستند.
  • درست مانند یک کلاس انتزاعی ، یک یانترفیس نمی تواند نمونه سازی شود. یعنی نمی توان شی از آن ساخت.
  • برای استفاده از یک اینترفیس، یک کلاس باید تمام متد (های) انتزاعی اعلام شده در آن را پیاده سازی کند.
  • یک اینترفیس نمی تواند سازنده (ها) در خود داشته باشد.
  • یک کلاس نمی تواند از بیش از یک کلاس مشتق شود ، اما می تواند هر تعداد اینترفیس را پیاده سازی کند.
  • یک اینترفیس می تواند از اینترفیس دیگری مشتق شود.
  • نمی توان یک اینترفیس را خصوصی (private) یا محافظت شده (protected) تعریف کرد.
توجه: یک کلاس از کلمه کلیدی implements برای پیاده سازی یک اینترفیس استفاده می کند اما یک اینترفیس از کلمه کلیدی extends برای گسترش یک اینترفیس دیگر استفاده می کند.

پیاده سازی

در مثال زیر کاربرد اینترفیس را در عمل مشاهده می کنید:
  • یک کلاس پایه به نام Bird یا پرنده
  • یک کلاس مشتق شده به نام Parrot یا طوطی
  • یک کلاس مشتق شده به نام Penguin یا پنگوئن
  • اینترفیسی به نام CanFly

در زیر کد را می بینید:
// Base class Bird
class Bird {   

  // Common trait of all birds so implemented in the base class
  public void eat() { 
    System.out.println(getClass().getSimpleName() + " is eating!");
  }
  
}// End of Bird class

interface CanFly {

  // The method is by default abstract and public
  void flying();   
  
}// End of CanFly interface

class Parrot extends Bird implements CanFly { // Parrot is extending from Bird and implementing CanFly

  @Override               // If you don't implement the flying() you will get an error!
  public void flying() { // Overriding the method of CanFly interface
    System.out.println("Parrot is Flying!");
  }
} // End of Parrot class

class Penguin extends Bird { // Penguin is a bird so extending from Bird
  
  // Penguin cannot fly so not implementing CanFly
  public void walk() {
    System.out.println("Penguin is Walking!");
  }
  
} // End of Penguin class

class Main {

  public static void main(String[] args) {

    Parrot parrot = new Parrot();   // Creating the Parrot object
    Penguin penguin = new Penguin(); // Creating the Penguin object

    parrot.eat();
    parrot.flying();

    System.out.println();    // Just creating a newline on console

    penguin.eat();
    penguin.walk();
    
  } // End of main()
  
} // End of Main class
در کد بالا خط ۱۴ نحوه پیاده سازی اینترفیس را نشان می دهد.

مزایای اینترفیس ها

  • اینترفیس ها به ما امکان می دهند مفهوم انتزاع را به صورت ۱۰۰٪ اجرا کنیم.
  • برای دستیابی به اتصال ضعیف (loose coupling) در برنامه می توان از اینترفیس استفاده کرد. این به این معنی است که تغییر در یک کلاس بر پیاده سازی کلاس دیگر تأثیر نمی گذارد و کلاس ها از هم مستقل اند.
  • با استفاده از اینترفیس ها ، می توان طرح های پیچیده به طرح های کوچکتر تقسیم کرد و وابستگی های بین اشیا را از بین برد.
  • می توان از اینترفیس ها برای دستیابی به وراثت چندگانه استفاده کرد (در جلسه بعدی بحث خواهد شد).

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا