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

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

Visibility Modifier (اصلاح‌کننده‌های دید) به دسته‌ای از کلمات کلیدی گفته می‌شود که سطح دسترسی کلاس‌ها، اشیاء، اینترفیس‌ها، توابع، پراپرتی‌ها و setter را مشخص می‌کنند. مثال ساده‌اش همان کلمۀ private ای است که قبل از یک پراپرتی (متغیر عضو کلاس) قرار می‌دهید. این کار به کامپایلر می‌گوید که فقط اعضای همین کلاس می‌توانند این پراپرتی را ببینند و لاغیر. در درس‌های پیشین (بحث کلاس و اشیاء) به صورت خلاصه دربارۀ مودیفایرهای public و private توضیحاتی داده شد. در این درس می‌خواهیم به بررسی سایر مودیفایرها در کاتلین بپردازیم.

مفعهوم اصلاح‌کننده‌های دید در داخل پکیج‌های کاتلین

در کاتلین، پکیج به مجموعه‌ای سازمان‌دهی شده از توابع، پراپرتی‌ها، کلاس‌ها، اشیاء و اینترفیس‌ها گفته می‌شود که در ابتدای تمام فایلها با کلمه package مشخص شده که جزء کدام پکیج است. این مفهوم از جاوا به ارث رسیده و مختص کاتلین نیست. در واقع پکیج یک مفهوم انتزاعی برای طبقه‌بندی اجزای مرتبط با یک کار خاص است. مثلاً java.util مجموعه‌ای از کلاس‌های کمکی را گردآورده است یا java.lang.math حاوی کلاس‌های مفیدی برای انجام اعمال ریاضی است.

ماژول نیز مجموعه‌ای از فایل‌ها گفته می‌شود که در کنار یکدیگر کامپایل می‌شوند. به عنوان مثال وقتی در اندروید استودیو یک پروژه جدید می‌سازید، به صورت خودکار ماژولی تحت عنوان app ساخته می‌شود. این ماژول تمام سورس‌کدها، ریسورس‌ها و فایل‌های پروژه را در بر می‌گیرد. وقتی دکمۀ کامپایل را می‌زنید ماژول فعلی کامپایل می‌شود. معمولاً اغلب پروژه‌هایی که ایجاد می‌کنید یک ماژول بیشتر ندارند ولی گاهی اوقات برای ساخت نسخۀ تبلتی یا wear (برای گجت‌های پوشیدنی مثلاً ساعت هوشمند اندرویدی) می‌توانید به جای ساخت چند پروژه مجزا، برای هر پلتفرم یک ماژول مجزا داخل پروژه تعریف کرد. برای اینکه قشنگ مفهوم پکیج و ماژول و ارتباطشان با هم را بفهمید توصیه می‌کنیم این تاپیک را در StackOverflow ببینید.

  • public: همه جا قابل مشاهده است؛
  • private: فقط داخل فایلی که تعریف شده دیده می‌شود؛
  • internal: تنها در ماژول فعلی قابل مشاهده است؛
  • protected: در پکیج‌ها قابل استفاده نبوده و فقط برای subclassها می‌توان استفاده کرد.
بخوانید  مراحل ساخت کتابخانه اندرویدی

توجه: اگر هیچ مودیفایری تعریف نکنید، به صورت پیش‌فرض public در نظر گرفته می‌شود.

مثال:

// file name: hello.kt

package test

fun function1() {}   // public by default and visible everywhere

private fun function2() {}   // visible inside hello.kt

internal fun function3() {}   // visible inside the same module

var name = "Foo"   // visible everywhere
    get() = field   // visible inside hello.kt (same as its property)
    private set(value) {   // visible inside hello.kt
        field = value
    }

private class class1 {}   // visible inside hello.kt

اصلاح دید داخل کلاس و اینترفیس‌ها

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

  • public: برای هر کلاینتی که تعریف کلاس را ببیند، قابل مشاهده است؛
  • private: تنها داخل کلاس قابل مشاهده است؛
  • internal: داخل کلاس و زیرکلاس‌های آن دیده می‌شود؛
  • protected: برای هر کلاینتی داخل ماژول قابل رؤیت است.

توجه: در صورتی که اعضای protected را بدون تعریف مودیفایر در زیرکلاس override کنید، مودیفایرش به صورت خودکار protected در نظر گرفته می‌شود.

مثال:

open class Base() {
    var a = 1                 // public by default
    private var b = 2         // private to Base class
    protected open val c = 3  // visible to the Base and the Derived class
    internal val d = 4        // visible inside the same module

    protected fun e() { }     // visible to the Base and the Derived class
}

class Derived: Base() {

    // a, c, d, and e() of the Base class are visible
    // b is not visible

    override val c = 9        // c is protected
}

fun main(args: Array<String>) {
    val base = Base()

    // base.a and base.d are visible
    // base.b, base.c and base.e() are not visible

    val derived = Derived()
    // derived.c is not visible
}

تغییر Visibility سازنده در کاتلین

به صورت پیش‌فرض visibility سازنده public است؛ اما می‌توان تغییرش داد. برای این کار باید صریحاً از کلیدواژه constructor استفاده کنید.

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

الان در کد پایین سازنده به صورت پیش‌فرض public است:

class Test(val a: Int) {
    // code
}

ولی به این صورت می‌توانید visibility آن را تغییر دهید:

class Test private constructor(val a: Int) {
    // code
}

اکنون visibility سازنده private است.

توجه: فانکشن‌های محلی، متغیرها و کلاس‌ها نمی‌توانند visibility modifier داشته باشند.

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

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

مطالب مرتبط

2 دیدگاه

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




    مهدی پیشگوی

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

    سلام. ممنون بابت مقاله. اینجا منظور از module چیه؟