0Pricing
Kotlin Academy · درس

دوال الامتداد: الصياغة وقواعد الإرسال

اكتب دوال امتداد وتعرّف على دلالات الإرسال الساكن.

دوال الامتداد: الصياغة وقواعد الإرسال درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ما دوال الامتداد؟

تتيح لكم دوال الامتداد إضافة دوال جديدة إلى الفئات الموجودة دون تعديلها أو استخدام التوريث.

البنية الأساسية لصياغة دالة الامتداد

ضعوا اسم الدالة مسبوقًا بالنوع الذي توسّعونه، ويُسمى هذا النوع «نوع المستقبل».
fun String.shout(): String = uppercase() + "!"
println("hello".shout())  // HELLO!
fun Int.isEven() = this % 2 == 0
println(4.isEven())  // true

this في الامتدادات

داخل دالة الامتداد، تشير 'this' إلى كائن المستقبل.
fun List<Int>.secondOrNull(): Int? {
    return if (size >= 2) this[1] else null
}
println(listOf(10, 20, 30).secondOrNull())  // 20
println(listOf(5).secondOrNull())           // null

التوزيع الساكن: الامتدادات لا تتجاوز الدوال

تُحل دوال الامتداد بشكل ساكن وقت الترجمة استنادًا إلى النوع المعلن — فهي ليست افتراضية.
open class Base
class Child : Base()
fun Base.greet() = "Hello from Base"
fun Child.greet() = "Hello from Child"

val obj: Base = Child()
println(obj.greet())  // "Hello from Base" (static dispatch!)

الامتدادات مقابل دوال الأعضاء

إذا احتوت فئة على دالة عضو لها التوقيع نفسه كتوقيع امتداد، فستُستدعى دالة العضو دائمًا.
class Greeter {
    fun hello() = "member hello"
}
fun Greeter.hello() = "extension hello"  // shadowed!
println(Greeter().hello())  // "member hello"

امتدادات المستقبل القابل للقيمة null

يمكنكم توسيع الأنواع القابلة للقيمة null. تعاملوا داخلها مع القيمة null باستخدام فحوصات 'this == null'.
fun String?.orEmpty() = this ?: ""
fun Any?.toStringSafe() = this?.toString() ?: "null"
println(null.orEmpty())  // ""
println(42.toStringSafe())  // "42"

الرؤية والنطاق

يمكن أن تكون الامتدادات على مستوى الملف (عالمية)، أو داخل فئة (امتدادات أعضاء)، أو في ملف. وهي تتبع قواعد الرؤية العادية.
// Top-level extension:
fun List<String>.joinUppercase() = joinToString { it.uppercase() }
// Private to file:
private fun String.clean() = trim().lowercase()

امتدادات الكائن المرافق

أضيفوا امتدادات إلى كائن مرافق لتوسيع مساحة أسماء الفئة.
class User(val name: String) {
    companion object
}
fun User.Companion.guest() = User("Guest")
val guest = User.guest()

الامتدادات على أنواع المكتبة القياسية

وسّعوا أي نوع، بما في ذلك الأنواع المضمنة.
fun Double.roundTo(decimals: Int): Double {
    val factor = Math.pow(10.0, decimals.toDouble())
    return Math.round(this * factor) / factor
}
println(3.14159.roundTo(2))  // 3.14

تنظيم الامتدادات

جمّعوا الامتدادات الخاصة بنوع ما في ملف مخصص، مثل StringExtensions.kt وDateExtensions.kt.
// StringExtensions.kt
fun String.titleCase() = split(" ")
    .joinToString(" ") {
        it.replaceFirstChar { c -> c.uppercase() }
    }
println("hello world".titleCase())  // Hello World

لا تستطيع الامتدادات الوصول إلى الأعضاء الخاصة

لا يمكن للامتدادات الوصول إلا إلى الأعضاء العامة والداخلية، وليس الأعضاء الخاصة أو المحمية.
class Secret {
    private val key = "hidden"
    val name = "public"
}
fun Secret.reveal() {
    println(name)  // OK
    // println(key)  // Error: key is private
}

تحقق سريع

إذا كانت لدالة عضو في فئة ولدالة امتداد التوقيع نفسه، فأيهما سيُستدعى؟

مراجعة

تضيف دوال الامتداد سلوكًا إلى أي فئة دون تعديلها. ويجري توزيعها بشكل ساكن (من دون تجاوز). وتفوز الأعضاء على الامتدادات. استخدموا المستقبلات القابلة للقيمة null لإنشاء أدوات مساعدة آمنة تجاه null. التالي: خصائص الامتداد!

الأسئلة الشائعة

هل درس «دوال الامتداد: الصياغة وقواعد الإرسال» مجاني؟

نعم — نص درس «دوال الامتداد: الصياغة وقواعد الإرسال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «دوال الامتداد: الصياغة وقواعد الإرسال»؟

اكتب دوال امتداد وتعرّف على دلالات الإرسال الساكن. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «دوال الامتداد: الصياغة وقواعد الإرسال»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. دوال الامتداد: الصياغة وقواعد الإرسال
  2. خصائص الامتداد والامتدادات المحسوبة
  3. الامتدادات ذات النطاق وامتدادات companion
  4. امتدادات عملية: مساعدات Context وView وString
← العودة إلى Kotlin Academy