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

نویسنده : سید ایوب کوکبی ۳۰ آذر ۱۳۹۷

آموزش زبان کاتلین – درس 22 (کلاس انتزاعی)

همانند جاوا، کاتلین نیز کلیدواژه abstract را برای تعریف کلاس‌های انتزاعی در اختیار ما قرار داده است. یک کلاس Abstract (به فارسی: انتزاعی) قابل نمونه‌سازی نیست؛ یعنی نمی‌توانید شی‌ای از روی این کلاس‌ها بسازید، با این حال امکان ساخت زیرکلاسی از آن‌ها وجود دارد. اعضای یک کلاس انتزاعی (پراپرتی‌ها و متدها)، انتزاعی نیستند مگر به صراحت با کلیدواژه abstract انتراعی بودنشان را اعلام کنیم.

مثال:

abstract class Person {
    
    var age: Int = 40

    fun displaySSN(ssn: Int) {
        println("My SSN is $ssn.")
    }

    abstract fun displayJob(description: String)
}

در این کد:

  • کلاس Person انتراعی تعریف شده است؛ یعنی نمی‌توانید از روی آن نمونه‌سازی کنید؛
  • این کلاس یک پراپرتی غیرانتزاعی تحت عنوان age و متدی غیرانتزاعی با نام ()displaySSN دارد. اگر تحت شرایطی نیازمند Override کردن این دو عضو در زیرکلاس دیگری باشید. بایستی حتماً کلیدواژه open در ابتدای نسخۀ سربارگذاری شده قرار گیرد؛
  • همچنین متدی انتزاعی تحت عنوان ()displayJob نیز وجود دارد که هیچ پیاده‌سازی نداشته و بایستی در زیرکلاس‌ها پیاده‌سازی شود.

توجه: کلاس‌های انتزاعی همیشه open هستند، بنابراین ارث‌بری از آن‌ها نیازمند کلیدواژه open نیست.

مثالی از کلاس‌ها و متدهای Abstract در کاتلین

abstract class Person(name: String) {

    init {
        println("My name is $name.")
    }

    fun displaySSN(ssn: Int) {
        println("My SSN is $ssn.")
    }

    abstract fun displayJob(description: String)
}

class Teacher(name: String): Person(name) {

    override fun displayJob(description: String) {
        println(description)
    }
}

fun main(args: Array<String>) {
    val jack = Teacher("Jack Smith")
    jack.displayJob("I'm a mathematics teacher.")
    jack.displaySSN(23123)
}

خروجی:

My name is Jack Smith.
I'm a mathematics teacher.
My SSN is 23123.

در اینجا کلاس Teacher از کلاس انتزاعی Person مشتق و شی jack از کلاس Teacher نمونه‌سازی شده است. سپس عبارت Jack Smith به عنوان پارامتری به سازنده اولیه ارسال شده است. این کار باعث اجرای بلاک initializer کلاس Person می‌شود. در ادامه متد ()displayJob بر روی شی jack فرخوانی می‌شود. این متد انتزاعی و متعلق به کلاس پایه بوده، بنابراین در نسخه Override شده در زیرکلاس Teacher پیاده‌سازی شده است. نهایتاً متد ()displaySSN روی شی jack فرخوانی شده است. این متد غیرانتزاعی و متعلق به کلاس Person است.

بخوانید  آموزش زبان کاتلین – درس 15 (توابع infix)

اینترفیس (Interface) چیزی شبیه Abstract است. با این تفاوت که برخلاف کلاس‌های انتزاعی، قادر به ذخیره حالت کلاس نیست. اینترفیس می‌تواند پراپرتی‌هایی داشته باشد ولی باید Abstract باشند یا accessor آن‌ها پیاده‌سازی شود ولی در کلاس‌های Abstract، اجباری به انتزاعی بودن پراپرتی‌ها نیست. در درس آینده بیشتر توضیح می‌دهم.

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

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

0 دیدگاه

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