در این بخش از مقاله آموزش کاتلین، به بررسی 4 مادیفایر نمایانی در کاتلین میپردازیم و طرز کار آنها را در سناریوهای مختلف بررسی میکنیم.
مادیفایرهای نمایانی کلیدواژههایی هستند که نمایانی (دسترسپذیری) کلاسها، شیءها، اینترفیسها، سازهها، تابعها، مشخصهها و setter-های آنها را تنظیم میکنند. توجه کنید که امکان تنظیم مادیفایر نمایانی getter-ها وجود ندارد، چون همواره همان نمایانی مشخصه را میگیرند.
در بخشهای قبلی این مقاله با مادیفایرهای نمایانی public و private به صورت اجمالی آشنا شدیم. در این بخش با دو مادیفایر دیگر به نامهای protected و internal نیز آشنا خواهیم شد.
مادیفایرهای نمایانی درون پکیج
یک پکیج مجموعهای از تابعها، مشخصهها و کلاسها، اشیا و اینترفیسهای مرتبط با هم را سازماندهی میکند.
مادیفایر | توضیح |
---|---|
public | اعلانها همه جا نمایان هستند. |
private | اعلانها فقط درون همان فایل نمایان هستند. |
internal | اعلانها درون همان ماژول (یک مجموع فایلهای کاتلین که با هم کامپایل میشوند) نمایان هستند. |
protected | اعلانها در دسترس پکیجها نیستند. |
اگر مادیفایر نمایانی تعیین نشود، به صورت پیشفرض مقدار 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
مادیفایرهای نمایانی درون کلاسها و اینترفیسها
طرز کار مادیفایرهای نمایانی برای تابعها و مشخصههای عضو اعلان شده درون یک کلاس به صورت زیر است:
مادیفایر | توضیح |
---|---|
public | در دید هر کلاینتی است که میتواند کلاس اعلان کننده را ببیند. |
private | صرفاً درون همان کلاس نمایان است. |
protected | درون کلاس و زیرکلاسهای آن نمایان است. |
internal | در دید هر کلاینتی درون ماژول است که میتواند کلاس اعلانکننده را ببیند. |
نکته: اگر یک عضو protected را در کلاس مشتقشده بدون تعیین نمایانی آن oveeride کنید، نمایانی آن همواره به صورت 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
}
تغییر دادن نمایانی یک سازنده
نمایانی یک سازنده به صورت پیشفرض به صورت public است. با این حال میتوان این وضعیت را تغییر داد. به این منظور باید یک کلیدواژه constructor به صورت صریح اضافه شود. این سازنده همانند مثال زیر به صورت پیشفرض public است:
class Test(val a: Int) { // code
}
روش تغییر دادن نمایانی آن به صورت زیر است:
class Test private constructor(val a: Int) { // code
}
در مثال فوق، سازنده به صورت private است. توجه کنید که در کاتلین، تابعهای لوکال، متغیرها و کلاسها نمیتوانند مادیفایر نمایانی داشته باشند.