Skip to content

السمات (Traits)

السمة هي عقد يُلزم الصنف بتنفيذ مجموعة من الدوال. تُستخدم لتعدد الأشكال (Polymorphism) ومشاركة السلوك المشترك.

تعريف سمة بسيطة

sad
سمة قابل_للطباعة
    دالة إلى_نص()
نهاية

تنفيذ سمة

sad
صنف نقطة نفّذ قابل_للطباعة
    متغير س
    متغير ص

    باني(س، ص)
        هذا.س = س
        هذا.ص = ص
    نهاية

    دالة إلى_نص()
        ارجع "(" + هذا.س + "، " + هذا.ص + ")"
    نهاية
نهاية

متغير ن = جديد نقطة(3، 4)
اطبع_سطر(ن.إلى_نص())  # (3، 4)

سمات متعددة

صنف واحد يمكنه تنفيذ عدة سمات:

sad
سمة قابل_للسرد
    دالة طول()
    دالة العنصر_في(فهرس)
نهاية

سمة قابل_للمقارنة
    دالة يساوي(آخر)
    دالة أقل_من(آخر)
نهاية

صنف قائمة_مرتّبة نفّذ قابل_للسرد، قابل_للمقارنة
    باني()
        هذا.البيانات = []
    نهاية

    دالة أضف(عنصر)
        هذا.البيانات = هذا.البيانات + [عنصر]
    نهاية

    # تنفيذ سمة قابل_للسرد
    دالة طول()
        ارجع طول(هذا.البيانات)
    نهاية

    دالة العنصر_في(فهرس)
        ارجع هذا.البيانات[فهرس]
    نهاية

    # تنفيذ سمة قابل_للمقارنة
    دالة يساوي(آخر)
        ارجع هذا.طول() == آخر.طول()
    نهاية

    دالة أقل_من(آخر)
        ارجع هذا.طول() < آخر.طول()
    نهاية
نهاية

السمات مع تنفيذ افتراضي

يمكن للسمة أن توفر تنفيذاً افتراضياً لبعض دوالها:

sad
سمة مسجّل
    دالة احصل_على_الاسم()   # مجردة — يجب تنفيذها

    دالة سجّل(رسالة)        # لها تنفيذ افتراضي
        اطبع_سطر("[" + هذا.احصل_على_الاسم() + "] " + رسالة)
    نهاية

    دالة سجّل_خطأ(رسالة)
        اطبع_سطر("[خطأ][" + هذا.احصل_على_الاسم() + "] " + رسالة)
    نهاية
نهاية

صنف خدمة_بيانات نفّذ مسجّل
    دالة احصل_على_الاسم()
        ارجع "خدمة_بيانات"
    نهاية
نهاية

متغير خ = جديد خدمة_بيانات()
خ.سجّل("بدأ التحميل")        # [خدمة_بيانات] بدأ التحميل
خ.سجّل_خطأ("فشل الاتصال")   # [خطأ][خدمة_بيانات] فشل الاتصال

استخدام السمات لتعدد الأشكال

sad
سمة شكل
    دالة مساحة()
    دالة محيط()
نهاية

صنف مربع نفّذ شكل
    متغير ضلع

    باني(ضلع)
        هذا.ضلع = ضلع
    نهاية

    دالة مساحة()
        ارجع هذا.ضلع ** 2
    نهاية

    دالة محيط()
        ارجع هذا.ضلع * 4
    نهاية
نهاية

صنف دائرة نفّذ شكل
    متغير نصف_قطر

    باني(نصف_قطر)
        هذا.نصف_قطر = نصف_قطر
    نهاية

    دالة مساحة()
        ارجع 3.14159 * هذا.نصف_قطر ** 2
    نهاية

    دالة محيط()
        ارجع 2 * 3.14159 * هذا.نصف_قطر
    نهاية
نهاية

# دالة تعمل مع أي شكل
دالة اطبع_معلومات(ش)
    اطبع_سطر("المساحة: " + ش.مساحة())
    اطبع_سطر("المحيط: " + ش.محيط())
نهاية

اطبع_معلومات(جديد مربع(5))     # المساحة: 25
اطبع_معلومات(جديد دائرة(3))    # المساحة: 28.27...

ملاحظات مهمة

الملاحظةالتفصيل
سمة كلمة سياقيةتعمل كمُعرّف عادي خارج سياقها
نفّذ و نفذكلاهما مقبول (بشدة أو بدونها)
تنفيذ متعدديفصل بفاصلة: نفّذ سمة1، سمة2
التنفيذ الافتراضيالسمة يمكنها توفير دوال مع جسم

السابق: الوراثة ←

مُرخَّص بموجب رخصة MIT