اینترفیس های برنامه نویسی کاتلین

4 سال پیش
اینترفیس های برنامه نویسی کاتلین

اینترفیس های برنامه نویسی کاتلین

در این درس از مجموعه آموزش های برنامه نویسی سایت سورس باران، با استفاده از مثالهایی در مورد اینترفیس های برنامه نویسی کاتلین (Kotlin Interfaces) و نحوه پیاده سازی آن در کاتلین آشنا خواهید شد.

اینترفیس های  کاتلین مشابه اینترفیس های جاوا هستند. آنها می توانند شامل تعریف متد های مجرد و همچنین پیاده سازی روش های غیر مجرد باشند. با این حال، آنها نمی توانند حاوی هیچگونه حالت باشند. به این معنی که، اینترفیس ممکن است مشخصه داشته باشد، اما این مشخصه ‌ها باید مجرد باشند یا برای آن ‌ها accessor پیاده‌ سازی شده باشد.

کلاسهای مجرد در کاتلین با یک تفاوت مهم مشابه اینترفیس کاربری هستند. و تفاوت آن ها در این است که لزومی به مجرد بودن مشخصه‌ ها یا وجود accessor نیست.

 

چگونه یک اینترفیس در کاتلین تعریف کنیم؟

کلید واژه interface برای تعریف اینترفیس ها در کاتلین استفاده می شود. به عنوان مثال،

interface MyInterface {

    var test: String   // abstract property

    fun foo()          // abstract method
    fun hello() = "Hello there" // method with default implementation
}

 

در مثال بالا موارد زیر به کار برده شده است؛

  • یک اینترفیس MyInterface ایجاد شده است.
  • این اینترفیس دارای یک مشخصه مجرد test  و یک متد مجرد foo () است.
  • اینترفیس همچنین یک متد غیر مجرد به نام hello() دارد.

 

 

چگونه یک اینترفیس در کاتلین  را پیاده سازی کنیم؟

روش پیاده ‌سازی یک کلاس یا شی در کاتلین به صورت زیر است:

interface MyInterface {

    val test: Int   // abstract property

    fun foo() : String   // abstract method (returns String)
    fun hello() {   // method with default implementation
        // body (optional)
    }
}

class InterfaceImp : MyInterface {

    override val test: Int = 25
    override fun foo() = "Lol"

    // other code
}

 

در مثال بالا، یک کلاس InterfaceImp اینترفیس MyInterface را پیاده سازی می کند.

این کلاس اعضای مجرد (مشخصه test و متد foo) مربوط به اینترفیس را override می‌کند.

 

مثال: چگونه یک اینترفیس در کار می کند؟

interface MyInterface {

    val test: Int

    fun foo() : String

    fun hello() {
        println("Hello there, pal!")
    }
}

class InterfaceImp : MyInterface {

    override val test: Int = 25
    override fun foo() = "Lol"

}

fun main(args: Array<String>) {
    val obj = InterfaceImp()

    println("test = ${obj.test}")
    print("Calling hello(): ")

    obj.hello()

    print("Calling and printing foo(): ")
    println(obj.foo())
}

 

خروجی کد به شکل زیر می باشد؛

test = 25
Calling hello(): Hello there, pal!
Calling and printing foo(): Lol

 

همانطور که در بالا ذکر شد، یک اینترفیس می‌تواند یک مشخصه داشته باشد که accessor را پیاده‌سازی کند. به مثال زیر توجه کنید:

interface MyInterface {

    // property with implementation
    val prop: Int
        get() = 23
}

class InterfaceImp : MyInterface {
    // class body
}

fun main(args: Array<String>) {
    val obj = InterfaceImp()

    println(obj.prop)
}

 

خروجی کد به شکل زیر می باشد؛

۲۳

 

در مثال بالا، prop مجرد نیست. با این حال، در داخل اینترفیس معتبر است زیرا پیاده سازی را برای accessor فراهم می کند.

با این حال، شما نمی توانید کدی مانند val prop: Int = 23 در داخل اینترفیس نوشت.

 

پیاده سازی دو یا چند اینترفیس در یک کلاس در کاتلین

کاتلین اجازه وراثت چندگانه واقعی را نمی دهد. با این حال، پیاده سازی دو یا چند اینترفیس در یک کلاس واحد امکان پذیر است. به عنوان مثال؛

interface A {

    fun callMe() {
        println("From interface A")
    }
}

interface B  {
    fun callMeToo() {
        println("From interface B")
    }
}

// implements two interfaces A and B
class Child: A, B

fun main(args: Array<String>) {
    val obj = Child()

    obj.callMe()
    obj.callMeToo()
}

 

خروجی کد به شکل زیر می باشد؛

From interface A
From interface B

حل تعارض‌ های override کردن (اینترفیس چندگانه)

فرض کنید، دو اینترفیس (A و B) یک متد غیر مجرد با همان نام دارند (بگذارید بگوییم روش callMe ()). شما این دو اینترفیس را در یک کلاس پیاده سازی کرده اید (بگذارید بگوییم C). حال، اگر با استفاده از شی کلاس C روش callMe () را فراخوانی کنید، کامپایلر خطایی ایجاد می کند. مثال زیر را با دقت دنبال کنید؛

interface A {

    fun callMe() {
        println("From interface A")
    }
}

interface B  {
    fun callMe() {
        println("From interface B")
    }
}

class Child: A, B 

fun main(args: Array<String>) {
    val obj = Child()

    obj.callMe()
}

 

خطا؛

Error:(14, 1) Kotlin: Class 'C' must override public open fun callMe(): Unit defined in A because it inherits multiple interface methods of it

 

برای حل این مسئله، باید پیاده ‌سازی خاص را ارائه دهید. نحوه کاربه صورت زیر می باشد:

interface A {

    fun callMe() {
        println("From interface A")
    }
}

interface B  {
    fun callMe() {
        println("From interface B")
    }
}

class C: A, B {
    override fun callMe() {
        super<A>.callMe()
        super<B>.callMe()
    }
}

fun main(args: Array<String>) {
    val obj = C()

    obj.callMe()
}

 

خروجی کد به شکل زیر می باشد؛

From interface A
From interface B

 

در مثال بالا، پیاده ‌سازی خاص متد () callMe در کلاس C ارائه شده است.

class C: A, B {
    override fun callMe() {
        super<A>.callMe()
        super<B>.callMe()
    }
}

 

گزاره super() <A> .callMe  متد () callMe کلاس A را فراخوانی می کند. به همین ترتیب، super() <B> .callMe متد ()callMe  کلاس B را فراخوانی می کند.

منبع.

لیست جلسات قبل آموزش برنامه نویسی کاتلین

  1. معرفی کاتلین،  Kotlin Hello World – اولین برنامه کاتلین
  2. انواع متغیرهای پایه در کاتلین
  3. عملگرهای برنامه نویسی کاتلین
  4. تبدیل نوع در برنامه نویسی کاتلین
  5. عبارت ها، گزاره ها و بلوک ها در برنامه نویسی کاتلین
  6. کامنت ها در برنامه نویسی کاتلین
  7. ورودی / خروجی پایه در برنامه نویسی کاتلین
  8. عبارت if در برنامه نویسی کاتلین
  9. عبارت when در برنامه نویسی کاتلین
  10. حلقه های while و do … while در برنامه نویسی کاتلین
  11. حلقه for در برنامه نویسی کاتلین
  12. عبارت break در برنامه نویسی کاتلین
  13. عبارت continue در برنامه نویسی کاتلین
  14. توابع در برنامه نویسی کاتلین
  15. فراخوانی تابع میانوندی در برنامه نویسی کاتلین
  16. آرگومان ‌های پیش ‌فرضآرگومان ‌های پیش ‌فرض و نام ‌دار در برنامه نویسی کاتلین
  17. توابع بازگشتی در برنامه نویسی کاتلین
  18. کلاس و شی در برنامه نویسی کاتلین
  19. سازنده ها در برنامه نویسی کاتلین
  20. Getter ها و Setter ها در برنامه نویسی کاتلین
  21. وراثت در برنامه نویسی کاتلین 
  22. مادیفایرهای نمایانی در برنامه نویسی کاتلین
  23. کلاس مجرد در برنامه نویسی کاتلین

 

 

0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه