Kotlin Academy · درس

خصائص الامتداد والامتدادات المحسوبة

أضف خصائص محسوبة إلى أصناف موجودة من دون إنشاء أصناف فرعية.

الدرس 2 من 413 خطوة

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

خصائص الامتداد

تضيف خصائص الامتداد خصائص محسوبة إلى الأنواع الموجودة دون إنشاء فئات فرعية. ولا تملك حقلًا خلفيًا.

خاصية امتداد للقراءة فقط

عرّفوا getter لإنشاء خاصية امتداد محسوبة.
val String.wordCount: Int
    get() = trim().split(Regex("\\s+")).size
println("hello world kotlin".wordCount)  // 3

خاصية امتداد قابلة للتغيير

عرّفوا getter وsetter معًا لإنشاء خاصية امتداد قابلة للقراءة والكتابة.
var MutableList<Int>.first: Int
    get() = this[0]
    set(value) { this[0] = value }
val list = mutableListOf(1, 2, 3)
list.first = 10
println(list)  // [10, 2, 3]

لا يوجد حقل خلفي

لا يمكن أن تحتوي خصائص الامتداد على حقول خلفية. فهي تُحسب دائمًا من الحالة الموجودة.
// ERROR: extension property cannot have backing field
// var String.cache: String = ""  // NOT allowed!

// OK: computed only:
val String.isPalindrome: Boolean
    get() = this == this.reversed()

خصائص الامتداد على المجموعات

أضيفوا خصائص ملائمة إلى أنواع المجموعات.
val <T> List<T>.secondOrNull: T?
    get() = if (size >= 2) this[1] else null
val <T> List<T>.isNotNullOrEmpty: Boolean
    get() = isNotEmpty()
println(listOf(1, 2, 3).secondOrNull)  // 2

خصائص امتداد منطقية

أنشئوا خصائص منطقية واضحة لفحوصات النوع.
val Any.isString: Boolean get() = this is String
val String.hasDigits: Boolean get() = any { it.isDigit() }
val Int.isPositive: Boolean get() = this > 0
println(42.isPositive)        // true
println("abc123".hasDigits)   // true

خصائص الامتداد مقابل دوال الامتداد

استخدموا خاصية عندما يكون الحساب بسيطًا ويمثّل سمة للكائن. واستخدموا دالة عندما تحتوي على معاملات أو آثار جانبية.
// Property: stateless, simple characteristic
val String.isEmail: Boolean get() = '@' in this
// Function: has parameters
fun String.padCenter(width: Int) = padStart((length + width) / 2)

توسيع كائن مرافق

أضيفوا خصائص امتداد إلى الكائنات المرافقة.
data class Color(val r: Int, val g: Int, val b: Int) {
    companion object
}
val Color.Companion.RED get() = Color(255, 0, 0)
val Color.Companion.WHITE get() = Color(255, 255, 255)
println(Color.RED)  // Color(r=255, g=0, b=0)

خصائص الامتداد السياقية

لا تنطبق خصائص الامتداد المعرّفة داخل فئة إلا عندما تكونون داخل نطاق تلك الفئة.
class Formatter {
    val Int.formatted: String
        get() = "%,d".format(this)
    fun format(n: Int) = n.formatted
}
println(Formatter().format(1000000))  // 1,000,000

استخدام الامتدادات في DSLs

تُعد خصائص الامتداد أساسية لتصميم DSL في Kotlin.
val Int.dp: Float get() = this * 2.5f
val Float.sp: Float get() = this * 1.0f
// In DSL context:
view.setPadding(16.dp.toInt())

خصائص الامتداد العامة

يمكن أن تحتوي خصائص الامتداد على معاملات نوع.
val <T> List<T>.head: T?
    get() = firstOrNull()
val <T> List<T>.tail: List<T>
    get() = drop(1)
println(listOf(1,2,3).head)  // 1
println(listOf(1,2,3).tail)  // [2, 3]

تحقق سريع

هل يمكن أن تحتوي خصائص الامتداد على حقول خلفية في Kotlin؟

مراجعة

تضيف خصائص الامتداد سمات محسوبة إلى الأنواع دون حقول خلفية. استخدموها للحسابات البسيطة عديمة الحالة. ويمكن أن تحتوي خصائص الامتداد القابلة للتغيير على setters. وهي مفيدة جدًا في DSLs وواجهات API الانسيابية. التالي: الامتدادات ذات النطاق وامتدادات الكائنات المرافقة!
البدء مجانًا

تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

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

هل درس «خصائص الامتداد والامتدادات المحسوبة» مجاني؟

نعم — نص درس «خصائص الامتداد والامتدادات المحسوبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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