Traits مختومة
تراتبيات مغلقة
Traits مختومة درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ما هي Trait؟
تشبه trait الواجهة؛ فهي تعلن عن نوع مشترك يمكن للأصناف الأخرى توسيعه.
تتيح لكم Traits تجميع الأنواع المرتبطة تحت مظلة واحدة، بحيث يمكن استخدامها بالتبادل.
Trait أساسية
أعلنوا عن trait باستخدام trait، ثم اجعلوا الأصناف أو الكائنات تستخدم extends لتوسيعها.
trait Shape
case class Circle(r: Double) extends Shape
case class Square(side: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Circle(2.0)
println(s)
}
}ما معنى sealed؟
لا يمكن توسيع trait المعلنة باستخدام sealed إلا بواسطة أنواع مُعلنة في الملف نفسه.
وبذلك تصبح البنية الهرمية مغلقة؛ إذ يعرف المترجم القائمة الكاملة للأنواع الفرعية الممكنة.
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def main(args: Array[String]): Unit = {
val c: Color = Green
println(c)
}
}استخدام Case Objects كبدائل
عندما لا تحتوي البديلة على بيانات، استخدموا case object بدلًا من case class. فلا يوجد سوى مثيل واحد منها.
وهذا مناسب تمامًا للقيم الشبيهة بالتعدادات.
sealed trait Direction
case object North extends Direction
case object South extends Direction
object Main {
def main(args: Array[String]): Unit = {
val d: Direction = North
println(d)
}
}الخلط بين الكائنات والأصناف
يمكن أن تحتوي trait المعلنة باستخدام sealed على بدائل من نوع case object (من دون بيانات) وبدائل من نوع case class (مع بيانات).
sealed trait Event
case object Started extends Event
case class Failed(reason: String) extends Event
object Main {
def main(args: Array[String]): Unit = {
val e: Event = Failed("timeout")
println(e)
}
}المطابقة على Trait معلنة باستخدام sealed
تطابقون على trait وتتولّون معالجة كل بديلة. وبما أن البنية الهرمية مغلقة، يستطيع المترجم التحقق من أنكم عالجتموها جميعًا.
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def hex(c: Color): String = c match {
case Red => "#FF0000"
case Green => "#00FF00"
case Blue => "#0000FF"
}
def main(args: Array[String]): Unit = {
println(hex(Green))
}
}تحذيرات المترجم
إذا نسيتم إحدى البدائل في match على trait معلنة باستخدام sealed، فسيحذّركم المترجم من الحالة المفقودة.
يساعد ذلك على اكتشاف الأخطاء عند إضافة بديلة جديدة لاحقًا. سنتناول هذا بالتفصيل في درس المطابقة الشاملة.
يمكن لـ Traits تعريف أعضاء
يمكن لـ trait تعريف دوال أو حقول تشترك فيها جميع الأنواع الفرعية أو يجب عليها تنفيذها.
sealed trait Animal {
def sound: String
}
case object Dog extends Animal { def sound = "Woof" }
case object Cat extends Animal { def sound = "Meow" }
object Main {
def main(args: Array[String]): Unit = {
println(Dog.sound)
println(Cat.sound)
}
}لماذا sealed؟
يمنحكم جعل trait مغلقة باستخدام sealed ما يلي:
- مجموعة معروفة ومغلقة من الأنواع الفرعية
- التحقق من شمولية
match - إعادة هيكلة أكثر أمانًا عند إضافة البدائل
تُستخدم Traits المغلقة مع case classes لبناء أنواع البيانات الجبرية في Scala.
استخدام البنية الهرمية
يمكن للدوال قبول نوع trait والعمل مع أي بديلة، مع تحديد التنفيذ عبر مطابقة الأنماط.
sealed trait Payment
case class Cash(amount: Int) extends Payment
case class Card(number: String) extends Payment
object Main {
def summary(p: Payment): String = p match {
case Cash(a) => s"cash $a"
case Card(n) => s"card ending ${n.takeRight(4)}"
}
def main(args: Array[String]): Unit = {
println(summary(Cash(50)))
println(summary(Card("123456789012")))
}
}جمع العناصر معًا
trait مغلقة تحتوي على بدائل متنوعة، وتشاركها دالة تطابق كل حالة.
sealed trait Result
case object Pending extends Result
case class Success(value: Int) extends Result
case class Error(msg: String) extends Result
object Main {
def show(r: Result): String = r match {
case Pending => "waiting"
case Success(v) => s"ok: $v"
case Error(m) => s"fail: $m"
}
def main(args: Array[String]): Unit = {
List(Pending, Success(7), Error("boom")).foreach(r => println(show(r)))
}
}اختبار سريع
اختبروا فهمكم لـ traits المغلقة.
مراجعة
تعلّمتم عن traits المغلقة:
- تعرّف
traitنوعًا فائقًا مشتركًا - تقيّد
sealedالأنواع الفرعية بالملف نفسه - استخدموا
case objectللبدائل التي لا تحتوي على بيانات، وcase classللبدائل التي تحتوي على بيانات - يتيح sealed التحقق من شمولية
match
تعلم Scala مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 39
- الدروس
- 143
الأسئلة الشائعة
هل درس «Traits مختومة» مجاني؟
نعم — نص درس «Traits مختومة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «Traits مختومة»؟
تراتبيات مغلقة تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Traits مختومة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Case Classes
- Traits مختومة
- أنواع البيانات الجبرية
- المطابقة الشاملة