Kotlin Academy · درس

‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما

تعرّف على الفرق بين sealed classes وsealed interfaces في Kotlin.

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

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

الأنواع sealed في Kotlin

تقيّد الفئات والواجهات sealed التسلسل الهرمي للفئات بمجموعة معروفة من الأنواع الفرعية، مما يتيح استخدام تعبيرات when الشاملة.

أساسيات sealed class

تقيّد sealed class التوريث الفرعي بالحزمة نفسها (في Kotlin 1.5 فأحدث) أو بالملف نفسه.
sealed class Shape
class Circle(val radius: Double) : Shape()
class Rectangle(val w: Double, val h: Double) : Shape()
object Unknown : Shape()

sealed interface: مرونة أكبر

تسمح sealed interface للأنواع الفرعية بتوسيع فئات أخرى وتنفيذ واجهات أخرى في الوقت نفسه — وهذا ما لا تستطيع sealed class فعله.
sealed interface Result<out T>
data class Success<T>(val value: T) : Result<T>
data class Error(val ex: Exception) : Result<Nothing>

الاختلافات الرئيسية

تتيح sealed class للفئات الفرعية امتلاك مُنشئات وحالة. أما sealed interface فتتيح للأنواع الفرعية توسيع أي فئة. استخدموا sealed interface عندما تحتاجون إلى مرونة أكبر.
// sealed class subtype extends another class:
sealed interface Command
class MoveCommand(val dx: Int, val dy: Int) : Command, Serializable
class ResizeCommand(val scale: Double) : Command, Cloneable

when شاملة: لا حاجة إلى else

عند تغطية جميع الأنواع الفرعية لـ sealed، يكون تعبير when شاملًا — فلا حاجة إلى else، ويفرض المصرّف اكتمال الحالات.
fun area(shape: Shape): Double = when (shape) {
    is Circle -> Math.PI * shape.radius * shape.radius
    is Rectangle -> shape.w * shape.h
}  // no 'else' — compiler guarantees completeness

إضافة نوع فرعي تكسر when الموجودة

عند إضافة نوع فرعي جديد إلى sealed، ستفشل تعبيرات when الموجودة في الترجمة حتى تُحدَّث. وهذه هي الفائدة الرئيسية.
// Add Triangle to Shape:
class Triangle(val base: Double, val height: Double) : Shape()
// Now the area() function above won't compile until
// a Triangle branch is added — safety net!

sealed classes مع الخصائص المشتركة

صرّحوا بالخصائص المشتركة داخل sealed class.
sealed class NetworkResult {
    abstract val timestamp: Long
}
data class SuccessResult(val data: String, override val timestamp: Long) : NetworkResult()
data class FailureResult(val error: String, override val timestamp: Long) : NetworkResult()

الأنواع sealed المتداخلة

يمكن أن تكون الأنواع الفرعية sealed نفسها، مما يتيح إنشاء تسلسلات هرمية متعددة المستويات.
sealed interface UiState
object Loading : UiState
sealed interface Loaded : UiState
data class Content(val items: List<String>) : Loaded
data class Empty(val hint: String) : Loaded
data class Failure(val error: String) : UiState

الأنواع الفرعية object للمتغيرات عديمة الحالة

استخدموا object للأنواع الفرعية sealed التي لا تحمل حالة.
sealed class Direction
object North : Direction()
object South : Direction()
object East : Direction()
object West : Direction()

fun move(d: Direction) = when (d) {
    North -> y++
    South -> y--
    East -> x++
    West -> x--
}

استخدام sealed وdata class وobject معًا

امزجوا بين data class (للأنواع الفرعية التي تحمل حالة) وobject (للكائنات المفردة) ضمن نوع sealed.
sealed class LoadState
object Idle : LoadState()
object Loading : LoadState()
data class Success(val count: Int) : LoadState()
data class Error(val msg: String) : LoadState()

متى تختارون sealed class أو interface

استخدموا sealed class عندما تشترك جميع الأنواع الفرعية في حالة مشتركة. واستخدموا sealed interface عندما تحتاج الأنواع الفرعية إلى توسيع فئات أساسية مختلفة أو تنفيذ واجهات أخرى.

تحقق سريع

ما الميزة التي تتمتع بها sealed interface مقارنةً بـ sealed class؟

مراجعة

تقيّد sealed class/interface التسلسل الهرمي بالأنواع المعروفة. ويكون when على sealed شاملًا، فلا حاجة إلى else. وتسمح sealed interface للأنواع الفرعية بتوسيع فئات أخرى. استخدموا data class للأنواع الفرعية ذات الحالة، وobject للأنواع عديمة الحالة.
البدء مجانًا

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

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

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

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

هل درس «‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما» مجاني؟

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

ماذا ستتعلم في «‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما»؟

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

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

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

كم من الوقت يستغرق درس «‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما»؟

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

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

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

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

  1. ‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما
  2. ‏when شامل مع التسلسلات الهرمية المختومة
  3. نمذجة حالة واجهة المستخدم باستخدام Sealed Classes
  4. تداخل التسلسلات الهرمية المختومة ودمجها
← العودة إلى Kotlin Academy