الفئات الداخلية
الوصول إلى النطاق الخارجي
الفئات الداخلية درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
الكلمة المفتاحية inner
يمنح تعليم الفئة المتداخلة باستخدام inner الفئةَ مرجعًا إلى المثيل الخارجي، ولذلك يمكنها الوصول إلى أعضاء الفئة الخارجية.
class Outer {
val msg = "Hello"
inner class Inner {
fun show() = msg
}
}
fun main() {
println(Outer().Inner().show())
}إنشاء مثيل داخلي
بما أن الفئة الداخلية تحتاج إلى مثيل خارجي، فإنك تنشئها انطلاقًا من مثيل خارجي: Outer().Inner().
class Engine {
val power = 100
inner class Turbo {
fun boosted() = power * 2
}
}
fun main() {
println(Engine().Turbo().boosted())
}الوصول إلى خصائص الفئة الخارجية
تقرأ الفئة الداخلية خصائص الفئة الخارجية وتستخدمها مباشرة، كما لو كانت هذه الخصائص تابعة لها.
class Counter {
var count = 0
inner class Stepper {
fun step() { count++ }
}
}
fun main() {
val c = Counter()
c.Stepper().step()
println(c.count)
}استدعاء أساليب الفئة الخارجية
يمكن للفئات الداخلية أيضًا استدعاء الأساليب على المثيل المحتوي.
class Printer {
fun line(s: String) = println(s)
inner class Job {
fun run() = line("printing")
}
}
fun main() {
Printer().Job().run()
}صيغة this@Outer
للإشارة إلى المثيل الخارجي بشكل صريح، مثلًا عند تعارض الأسماء، استخدم this@Outer.
class Outer {
val value = 10
inner class Inner {
val value = 20
fun outerValue() = this@Outer.value
}
}
fun main() {
println(Outer().Inner().outerValue())
}لماذا نستخدم inner؟
استخدم inner عندما يحتاج النوع المتداخل فعلًا إلى التعاون مع مثيل خارجي محدد ومشاركة حالته.
class Wallet {
var balance = 50
inner class Transaction(val amount: Int) {
fun apply() { balance += amount }
}
}
fun main() {
val w = Wallet()
w.Transaction(25).apply()
println(w.balance)
}كل فئة داخلية مرتبطة بفئة خارجية واحدة
يرتبط المثيل الداخلي بالمثيل الخارجي المحدد الذي أنشأه؛ ولذلك تنتقل التغييرات إلى ذلك الكائن.
class Box(var size: Int) {
inner class Resizer {
fun grow() { size += 1 }
}
}
fun main() {
val b = Box(3)
b.Resizer().grow()
println(b.size)
}الفئة الداخلية مقابل المتداخلة
من دون inner، تكون الفئة المتداخلة معزولة. ومع inner، تلتقط المثيل الخارجي. هذه الكلمة المفتاحية هي الفرق بأكمله.
class Outer {
val tag = "X"
inner class A { fun get() = tag }
}
fun main() {
println(Outer().A().get())
}ملاحظة حول الذاكرة
بما أن المثيل الداخلي يُبقي المثيل الخارجي حيًا، انتبه عند استخدام كائنات داخلية طويلة العمر لتجنب الاحتفاظ بالكائن الخارجي من دون قصد.
class Service {
val id = 1
inner class Worker { fun who() = id }
}
fun main() {
println(Service().Worker().who())
}مُكرِّر واقعي
تُعد الفئة الداخلية مثالية لمُكرِّر يتنقل بين حالة المجموعة التي تحتويه.
class Stack {
private val items = mutableListOf(1, 2, 3)
inner class Reader {
fun all() = items.joinToString()
}
}
fun main() {
println(Stack().Reader().all())
}دمج المفاهيم
يمكن للفئات الداخلية استخدام حالة الفئة الخارجية وإزالة الالتباس باستخدام this@Outer.
class Outer {
val n = 5
inner class Inner {
fun doubled() = this@Outer.n * 2
}
}
fun main() {
println(Outer().Inner().doubled())
}تحقق سريع
اختبر مدى فهمك للفئات الداخلية.
مراجعة
لقد تعلمت عن الفئات الداخلية:
- تمنح
innerالفئةَ الداخليةَ الوصولَ إلى المثيل الخارجي وأعضائه. - تُنشأ من خلال مثيل خارجي:
Outer().Inner(). - استخدم
this@Outerللإشارة إلى المثيل المحتوي. - تُبقي المثيلات الداخلية مثيلاتها الخارجية حيّة.
class Outer {
val v = 1
inner class Inner { fun get() = v }
}
fun main() {
println(Outer().Inner().get())
}الأسئلة الشائعة
هل درس «الفئات الداخلية» مجاني؟
نعم — نص درس «الفئات الداخلية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «الفئات الداخلية»؟
الوصول إلى النطاق الخارجي تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الفئات الداخلية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الفئات المتداخلة
- الفئات الداخلية
- الكائنات المجهولة
- الفئات المحلية