الكلمة المفتاحية by
فوّضوا تنفيذ الواجهة
الكلمة المفتاحية by درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ما التفويض؟
يتيح تفويض الفئة لكائنٍ ما إسناد تنفيذ واجهة إلى كائن آخر. وتدمج Kotlin هذه الإمكانية في اللغة باستخدام الكلمة المفتاحية by.
إنه تركيب أصبح سهلًا.
واجهة للتفويض
ابدأ بواجهة وتنفيذ ملموس لها. وسنفوّض لاحقًا إلى هذا التنفيذ.
interface Speaker {
fun speak(): String
}
class LoudSpeaker : Speaker {
override fun speak() = "HELLO!"
}
fun main() {
println(LoudSpeaker().speak())
}الكلمة المفتاحية by
اكتب class X(d: Iface) : Iface by d. ينشئ المصرّف أساليب إعادة توجيه تستدعي d لكل عضو من أعضاء الواجهة.
interface Speaker {
fun speak(): String
}
class LoudSpeaker : Speaker {
override fun speak() = "HELLO!"
}
class Announcer(s: Speaker) : Speaker by s
fun main() {
val a = Announcer(LoudSpeaker())
println(a.speak())
}دون تعليمات نمطية
من دون by، ستكتب يدويًا أسلوب إعادة توجيه لكل دالة في الواجهة. أما التفويض فينشئها جميعًا تلقائيًا.
interface Repository {
fun save(item: String): String
fun count(): Int
}
class MemoryRepo : Repository {
private val items = mutableListOf<String>()
override fun save(item: String): String { items.add(item); return item }
override fun count() = items.size
}
class LoggingRepo(r: Repository) : Repository by r
fun main() {
val repo = LoggingRepo(MemoryRepo())
repo.save("a")
println(repo.count())
}إعادة تعريف أعضاء محددين
يمكنك إعادة تعريف الأعضاء الذين تريد تخصيصهم فقط؛ أما الباقون فيستمر توجيههم إلى المفوَّض.
interface Repository {
fun save(item: String): String
fun count(): Int
}
class MemoryRepo : Repository {
private val items = mutableListOf<String>()
override fun save(item: String): String { items.add(item); return item }
override fun count() = items.size
}
class LoggingRepo(private val r: Repository) : Repository by r {
override fun save(item: String): String {
println("saving " + item)
return r.save(item)
}
}
fun main() {
val repo = LoggingRepo(MemoryRepo())
repo.save("book")
println(repo.count())
}المفوَّض كمعامل
يمرَّر المفوَّض عادةً عبر المُنشئ الأساسي. ويمكنك الاحتفاظ بمرجع إليه باستخدام private val إذا كنت ستعيد تعريف بعض الأعضاء أيضًا.
interface Clock { fun now(): Int }
class FixedClock : Clock { override fun now() = 12 }
class App(private val clock: Clock) : Clock by clock
fun main() {
println(App(FixedClock()).now())
}تفويض الواجهات القياسية
يمكنك التفويض إلى واجهات المجموعات المضمّنة، فتحصل فورًا على حاوية تتصرف مثل المجموعة الأساسية.
class TaggedList(private val inner: List<String>) : List<String> by inner {
val tag = "v1"
}
fun main() {
val tl = TaggedList(listOf("x", "y"))
println(tl.size)
println(tl[0])
println(tl.tag)
}كيف يُصرَّف
في الخلفية، يخزّن المصرّف المفوَّض ويصدر تطبيقات إعادة التوجيه. وتستدعي الأساليب المُنشأة ببساطة الأسلوب المطابق في المفوَّض. وهذا يعادل إعادة التوجيه المكتوبة يدويًا، من دون عناء الكتابة.
لقطة ملتقطة
تفصيل مهم: يُلتقط مرجع المفوَّض عند إنشاء الكائن. وتستدعي الأعضاء التي أُعيد تعريفها المفوَّض صراحةً، بينما تستخدم عمليات إعادة التوجيه المُنشأة المثيل الذي قُدّم في الأصل.
interface Source { fun value(): Int }
class Const(val n: Int) : Source { override fun value() = n }
class Wrapper(s: Source) : Source by s
fun main() {
val w = Wrapper(Const(42))
println(w.value())
}لماذا نستخدم by
تتيح لك الكلمة المفتاحية by ما يلي:
- إعادة استخدام التطبيقات الموجودة
- إضافة سلوك من دون التوريث من فئة
- تجنب تسلسلات التوريث الهشة
إنها دعم Kotlin المدمج لمبدأ تفضيل التركيب على التوريث.
الأساس
هذه الكلمة المفتاحية by هي الأساس لكل ما يرد في هذه الدورة. وسننظر تاليًا بمزيد من التفصيل في التفويض إلى كائنات الأعضاء لتركيب السلوك.
اختبار سريع
اختبر فهمك للكلمة المفتاحية by.
مراجعة
لقد تعلّمت تفويض الفئات باستخدام by:
- تفويض واجهة إلى كائن آخر
- إنشاء أساليب إعادة توجيه تلقائيًا
- إعادة تعريف أعضاء محددين مع توجيه الباقين
- يعمل أيضًا مع الواجهات المضمّنة
التالي: التفويض إلى الأعضاء لتركيب السلوك.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «الكلمة المفتاحية by» مجاني؟
نعم — نص درس «الكلمة المفتاحية by» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «الكلمة المفتاحية by»؟
فوّضوا تنفيذ الواجهة تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الكلمة المفتاحية by»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الكلمة المفتاحية by
- التفويض إلى الأعضاء
- التفويض مقابل الوراثة
- أنماط عملية