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

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

کلاس تودرتو (Nested Class) در کاتلین

همچون جاوا، کاتلین نیز اجازه می‌دهد تا داخل یک کلاس، کلاس دیگری تعریف کنید:

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

از آنجایی که کلاس Nested عضوی از کلاس Outer است، به راحتی می‌توانید از . (نقطه) برای دسترسی به اعضای کلاس Nested استفاده کنید.

مثال:

class Outer {

    val a = "Outside Nested class."

    class Nested {
        val b = "Inside Nested class."
        fun callMe() = "Function call from inside Nested class."
    }
}

fun main(args: Array<String>) {
    // accessing member of Nested class
    println(Outer.Nested().b)

    // creating object of Nested class
    val nested = Outer.Nested()
    println(nested.callMe())
}

خروجی:

Inside Nested class.
Function call from inside Nested class.

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

inner class در کاتلین

کلاس‌های تودرتو یا nested در کاتلین، هیچ نوع دسترسی به نمونه ایجاد شده از کلاس بیرونی (outer) ندارند. مثلاً:

class Outer {
    val foo = "Outside Nested class."

    class Nested {
        // Error! cannot access member of outer class.
        fun callMe() = foo
    }
}

fun main(args: Array<String>) {

    val outer = Outer()
    println(outer.Nested().callMe())
}

با اجرای این کد کامپایلر خطا می‌دهد. دلیلش این است که از داخل Nested Class تلاش کرده‌ایم به مقدار foo که در کلاس بیرونی (Outer) قرار دارد دست بیابیم. برای حل این مشکل باید کلاس داخلی را با مودیفایر inner به یک inner class تبدیل کنیم. در این حالت حق دسترسی به اعضای کلاس بیرونی را خواهیم داشت.

class Outer {

    val a = "Outside Nested class."

    inner class Inner {
        fun callMe() = a
    }
}

fun main(args: Array<String>) {

    val outer = Outer()
    println("Using outer object: ${outer.Inner().callMe()}")

    val inner = Outer().Inner()
    println("Using inner object: ${inner.callMe()}")
}

خروجی:

Using outer object: Outside Nested class.
Using inner object: Outside Nested class.
بخوانید  آموزش زبان کاتلین – درس 9 (when)

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

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

0 دیدگاه

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