معدِّلات الرؤية
جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 8 من 57.
التغليف يعني أن الفئة تتحكم في كيفية استخدام بياناتها. تحدد معدِّلات مستوى الرؤية من يمكنه رؤية أحد الأعضاء. يخفيه private عن كل ما هو خارج الفئة، لذا تكون أساليب الفئة نفسها هي الطريقة الوحيدة للوصول إليه:
class Account {
private var balance = 0
fun deposit(amount: Int) {
if (amount > 0) balance += amount
}
fun report() = "balance: $balance"
}داخل main:
val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000 // خطأ: لا يمكن الوصول إلى 'balance': إنه privateالناتج:
balance: 50لدى Kotlin أربعة مُعدِّلات. من دون أحدها يكون التصريح public، ومرئيًا في كل مكان:
public // افتراضي: مرئي في كل مكان
internal // مرئي في نفس الوحدة (تطبيق أو مكتبة)
protected // مرئي في الصنف وأصنافه الفرعية
private // مرئي داخل الصنف (أو الملف، للإعلانات على المستوى الأعلى)تحافظ الدوال المساعدة الخاصة على صِغر الواجهة العامة. يرى المستدعون ما تفعله الفئة، وليس كيف تفعله:
class Password(private val text: String) {
val isStrong: Boolean
get() = hasDigit() && text.length >= 8
private fun hasDigit() = text.any { it.isDigit() }
}داخل main:
println(Password("secret123").isStrong)
println(Password("short1").isStrong)الناتج:
true
falseتأخذ خصائص المُنشئ معدِّلات أيضًا: يخزّن private val قيمةً لا يمكن للكود الخارجي قراءتها. إن إخفاء البيانات هو ما يتيح للفئة التحقق من كل تغيير والحفاظ على قواعدها:
class Locker(private val code: String) {
private val items = mutableListOf<String>()
fun store(item: String, code: String): Boolean {
if (code != this.code) return false
items.add(item)
return true
}
}التحدي
سهلأكمل الصنف Locker(private val code: String). قائمته items خاصة. تضيف store(item, code) العنصر فقط عندما يتطابق الرمز، وتُرجع ما إذا كانت الإضافة قد تمت؛ وتُرجع open(code) العناصر مفصولة باستخدام , (أو empty) عندما يتطابق الرمز، وتُرجع wrong code خلاف ذلك.
يقرأ الكود المتوفَّر رمز الخزانة، ثم الأوامر put <code> <item> أو open <code>. ويطبع stored أو denied لكل أمر put، ونتيجة كل أمر open.
يجب وضع كودك في Locker.kt. يحتوي Main.kt على كود الإدخال/الإخراج المتوفَّر، ولا يمكن تعديله.
جرّب بنفسك
fun main() {
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
val input = generateSequence(::readLine).toList()
val locker = Locker(input[0])
for (cmd in input.drop(1)) {
val p = cmd.split(" ")
if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
else println(locker.open(p[1]))
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin