آموزش زبان کاتلین – درس ۲۸ (اشیاء Companion)

نویسنده : سید ایوب کوکبی ۲۸ دی ۱۳۹۷

آموزش زبان کاتلین – درس 28 (اشیاء Companion)

قبل از توضیح اشیاء Companion در کاتلین به مثالی از نحوه دسترسی به اعضای یک کلاس نگاه کنیم. این مثال نشان می‌دهد که در حالت عادی چگونه به اعضای داخلی یک کلاس می‌توانیم دسترسی داشته باشیم و در ادامه توضیح می‌دهیم که برای فرخوانی اعضای یک کلاس مثلا فرخوانی یک متد لزوماً نیازی به نمونه‌سازی از آن نیست. این کار را به کمک کلاس‌های Companion انجام می‌دهیم. پس ابتدا ببینیم برای دسترسی به یک متد چه کاری لازم است انجام دهیم:

class Person {
    fun callMe() = println("I'm called.")
}

fun main(args: Array<String>) {
    val p1 = Person()
    
    // calling callMe() method using object p1
    p1.callMe()    
}

اینجا از کلاس Person آبجکت p1 ساخته شده و روی آن متد ()callMe را فرخوانده‌ایم. همه چیز به صورت عادی و نرمال کار می‌کند. ولی در کاتلین بدون ساخت شی و تنها با نام کلاس نیز می‌توان به اعضای آن دسترسی داشت. برای این کار از کلیدواژه companion استفاده می‌شود به این صورت:

class Person {
    companion object Test {
        fun callMe() = println("I'm called.")
    }
}

fun main(args: Array<String>) {
    Person.callMe()
}

خروجی:

I'm called.

در این برنامه، شی Test با کلیدواژه companion علامت‌گذاری شده است. بنابراین می‌توانید با آوردن نام کلاس، متد ()callMe را فرخوانی کنید. نامگذاری شی companion اختیاری بوده و می‌توانید حذفش کنید.

class Person {
    
    // name of the companion object is omitted
    companion object {
        fun callMe() = println("I'm called.")
    }
}

fun main(args: Array<String>) {
    Person.callMe()
}

اگر با زبان جاوا آشنا باشید، احتمالاً فهمیده‌اید که اشیاء companion معادل همان متدهای استاتیک در جاوا هستند (حتی با وجود تفاوت مکانیزم داخلی آن‌ها). اشیاء companion می‌توانند به اعضای خصوصی یک کلاس دسترسی داشته باشند. بنابراین می‌توانید از آن‌ها برای پیاده‌سازی الگوی طراحی factory استفاده کنید. با جستجو در اینترنت به راحتی می‌توانید کاربردهای مختلفی از این الگوی طراحی بیابید.

بخوانید  آموزش زبان کاتلین – درس 24 (کلاسهای تودرتو یا داخلی)

سید ایوب کوکبی

نویسنده و مترجم...

2 دیدگاه

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




    مهدی پیشگوی

    دوشنبه ۰۵ فروردین ۱۳۹۸

    ممنون. از companion برای ایجاد کلاسهایی که نیاز به تعریف و نمونه سازی خاصی نداریم هم استفاده میشه؟
    تو اندروید چندجا دیدم ازش استفاده کردن ولی به صورت کلاس نه متد ممنون میشم این رو توضیح بدید