اینترفیس ها در کاتلین

اینترفیس ها در کاتلین

توضیحات و ویژگی ها

در این مطلب به مقایسه و بررسی اینترفیس (interface) ها با کلاس های ابستراکت و ویژگی آنها در کاتلین پرداختیم و همچنین اینترفیس های تابعی در کاتلین رو بررسی کردیم.

مشابه کلاس های ابستراکت در اینترفیس (interface) ها، میتونیم توابع concrete (کامل) و توابع abstract تعریف کنیم.

interface Foo { //Concrete Function Implementation fun myConcreteFunction(){ println("From Concrete Function") } //Abstract Function fun myAbstractFunction() }

در اینترفیس ها نمیتونیم کانستراکتور تعریف کنیم؛ چون اینترفیس ها کانستراکتور ندارن پس پراپرتی ها باید abstract باشن مگه پراپرتی های val که تابع getter دارن.

interface Foo { abstract var prop0: String val prop1: String get() = "Prop1" }

هر اینترفیس میتونه از یک یا چند اینترفیس ارث بری کنه.

interface A { ... } interface B { ... } interface C: A, B { ... }

همانند کلاس های ابستراکت از اینترفیس ها نیز نمیشه نمونه (شی) سازی کرد.

هر کلاسی میتونه از یک کلاس وچند اینترفیس ارث بری کنه.

interface A { ... } interface B { ... } open class Foo { ... } class Bar: Foo(), A, B{ ... }

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

به دو روش میتونیم از اینترفیس استفاده کنیم:

۱- ارث بری از اینترفیس

در این روش مانند قسمت قبل که اشاره شد اینترفیس رو تعریف میکنیم و ازش توسط کلاس یا اینترفیس دیگه ارث بری میکنیم.

۲- پیاده سازی مستقیم اینترفیس

میتونیم اینترفیس رو مانند زیر در کد پیاده‌سازی کنیم:

interface Player{ fun play() fun stop() fun pause() } fun main(){ val player = object: Player{ override fun play(){ ... } override fun stop(){ ... } override fun pause(){ ... } } }

اینترفیس های تابعی

اینترفیس هایی که فقط یک تابع دارن میتونیم به صورت تابعی داخل کد پیاده سازیشون کنیم به این اینترفیس ها Single Abstract Method Interface (SAM) نیز گفته میشه.

برای اینکه یک اینترفیس تابعی باشه باید قبل از کلیدواژه ی اینترفیس از کلید واژه ی fun نیز استفاده کنیم.

در مثال زیر اینترفیس رو به دو روش معمولی و تابعی پیاده‌سازی کردیم:

fun interface PredictableNumber{ fun predict(v: Int): Boolean } fun main(){ // پیاده سازی به روش معمولی val prime = object: PredictableNumber{ override fun predict(v: Int){ var isPrime = false for(i in 0 until v/2){ if(v % i == 0){ isPrime = true break } } return isPrime } } //پیاده سازی به روش تابعی val even = PredictableNumber{ it % 2 == 0} println("is 53 prime? ${prime.predict(53)"} println("is 53 even? ${even.predict(53)"}

خلاصه

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

در اینترفیس ها نمیتونیم کانستراکتور داشته باشیم.

در اینترفیس ها نمیتونیم پراپرتی تعریف کنیم مگه پراپرتی نوع val با تابع getter باشه.

هر اینترفیس میتونه از یک یا چند اینترفیس ارث ببره.

هر کلاسی علاوه بر یک کلاس از یک یا چند اینترفیس میتونه ارث ببره.

علاوه بر ارث بری میتونیم اینترفیس ها رو داخل کد پیاده‌سازی کنیم.

اینترفیس هایی که فقط یک تابع ابستراکت دارند رو میتونیم به صورت تابعی پیاده‌سازی کنیم که بهشون اینترفیس های تابعی و یا Single Abstract Method Interface (SAM) گفته میشه.

arrow_drop_up
کپی شد!