آموزش زبان کاتلین – درس ۲۷ (Object Declarations و Object Expression)

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

Object Decleration در کاتلین

سینگلتون (Singleton) یک الگوی شی‌گرا است که در آن کلاس فقط می‌تواند یک نمونه (آبجکت) داشته باشد. مثلاً فرض کنید در حال کار روی برنامه‌ای هستید که در پشت‌صحنه از دیتابیس SQL استفاده می‌کند. شما می‌خواهید یک اتصال به دیتابیس ایجاد کنید که در تمامی کلاینت‌ها بتوانید از همان کانکشن استفاده کنید. اینجا می‌توانید بخش اتصال به دیتابیس را به صورت یک کلاس سینگلتون تعریف کنید تا مطمئن شوید در تمام برنامه فقط یک نقطه مرکزی برای اتصال به دیتابیس وجود دارد. کاتلین ساخت کلاس‌های سینگلتون را بسیار راحت کرده است. تنها کافی است از کلیدواژه object در تعریف کلاس استفاده کنید. به این صورت:

object SingletonExample {
    ... .. ...
    // body of class
    ... .. ...
}

این آبجکت‌ها می‌توانند پراپرتی، متد و هر چیزی که کلاسها دارند داشته باشن؛ فقط نمی‌توانند سازنده داشته باشند. همانند اشیاء معمولی با استفاده از نقطه می‌توانید به متدها و پراپرتی‌های این اشیاء دسترسی پیدا کنید.

 مثالی از Object Declaration

object Test {
    private var a: Int = 0
    var b: Int = 1

    fun makeMe12(): Int {
        a = 12
        return a
    }
}

fun main(args: Array<String>) {
    val result: Int

    result = Test.makeMe12()

    println("b = ${Test.b}")
    println("result = $result")
}

خروجی:

b = 1
result = 12

Object Declarationها همانند کلاس‌های معمولی می‌توانند از اینترفیس‌ها و کلاس‌های دیگر ارث‌بری کنند.

سینگلتون و تزریق وابستگی

Object Declaration گاهی اوقات می‌تواند مفید باشد با این حال برای سیستم‌های نرم‌افزاری که با قسمت‌های مختلفی در ارتباط هستند مناسب نیستند. در واقع با بزرگ شدن سیستم، خواه‌ناخواه قسمت‌های جدیدی به آن اضافه خواهد شد که به مرور وابستگی‌ها را زیاد می‌کنند و در چنین شرایطی استفاده از Object Declaration کارایی سابق را نخواهد داشت.

بخوانید  تست کدها در اندروید - بخش اول

Object Expression در کاتلین

کلیدواژه object همچنین می‌تواند برای ساخت اشیاء از کلاس‌های ناشناس استفاده شود. در واقع زمانی که نیازمند ساخت آبجکتی از یک کلاس یا اینترفیس با حداقل تغییرات و بدون ساخت زیرکلاس از آن هستید می‌توانید از object استفاده کنید به این صورت:

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
})

این مثال از سایت رسمی کاتلین گرفته شده است.

اینجا یک شی anonymous یا ناشناس ساخته شده که کلاس MouseAdapter را اکستند کرده است. برنامه دو متد ()mouseClicked و ()mouseEntered را override کرده است. در صورت نیاز می‌توانید برای شی ناشناس یک نام نیز انتخاب کنید و داخل متغیری ذخیره‌اش کنید.

val obj = object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

مثالی از Object Expression در کاتلین

open class Person() {
    fun eat() = println("Eating food.")

    fun talk() = println("Talking with people.")

    open fun pray() = println("Praying god.")
}

fun main(args: Array<String>) {
    val atheist = object : Person() {
        override fun pray() = println("I don't pray. I am an atheist.")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

خروجی:

Eating food.
Talking with people.
I don't pray. I am an atheist.

اینجا شی ناشناس را داخل متغیر athesit ذخیره کرده‌ایم که کلاس Person را پیاده‌سازی و متد ()pray را override کرده است. اگر می‌خواهید کلاسی را پیاده‌سازی کنید که حاوی سازنده‌ای از شی ناشناس باشد بایستی پارامترهای مناسبی را به سازنده ارسال کنید. برای مثال:

open class Person(name: String, age: Int) {

    init {
        println("name: $name, age: $age")
    }

    fun eat() = println("Eating food.")
    fun talk() = println("Talking with people.")
    open fun pray() = println("Praying god.")
}

fun main(args: Array<String>) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("I don't pray. I am an atheist.")
    }

    atheist.eat()
    atheist.talk()
    atheist.pray()
}

خروجی:

name: Jack, age: 29
Eating food.
Talking with people.
I don't pray. I am an atheist.

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

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

0 دیدگاه

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