AzLearn

الوراثة وتعدد الأشكال

Inheritance & Polymorphism

مفهوم ~25 دقيقة

الوراثة وتعدد الأشكال — Inheritance & Polymorphism

بعد أن تعلمت كيف تبني فئة (Class) واحدة، الخطوة التالية هي فهم كيف تتشارك فئات متعددة في سلوك مشترك دون تكرار الكود. الوراثة (Inheritance) تتيح لك بناء فئة جديدة تستند إلى فئة موجودة وتضيف عليها أو تُعدّل فيها.

مشكلة التكرار

تخيّل أنك تبني نظاماً للأشكال الهندسية. كل شكل له اسم ولون، وكل شكل يحسب مساحته بطريقة مختلفة. بدون وراثة:

class Circle:
    def __init__(self, name, color, radius):
        self.name = name
        self.color = color
        self.radius = radius

class Rectangle:
    def __init__(self, name, color, width, height):
        self.name = name    # تكرار — duplication
        self.color = color  # تكرار — duplication
        self.width = width
        self.height = height

الحقلان name وcolor مكرران. مع ازدياد الأشكال يتضاعف التكرار. الوراثة تحل هذا.

الفئة الأم والفئة الابنة

main.go

super() — استدعاء الأم

super().__init__(...) يستدعي مُنشئ الفئة الأم. هذا يتيح للفئة الابنة أن تُعدّ الحقول الموروثة دون إعادة كتابتها.

قاعدة عملية: استدع super().__init__() دائماً أول شيء في __init__ الابنة لضمان أن الأم تُعدّ حقولها قبل أي منطق خاص بالابنة.

تعدد الأشكال — Polymorphism

تعدد الأشكال (Polymorphism) يعني أن نفس الأسلوب يتصرف بشكل مختلف حسب نوع الكائن. نفس الاسم area() ينتج نتائج مختلفة لدائرة ومستطيل ومثلث:

main.go

هذا هو جوهر تعدد الأشكال: الحلقة for shape in shapes لا تعرف هل الكائن دائرة أو مستطيل — تستدعي فقط shape.info() وكل كائن يُجيب بطريقته. هذا يجعل إضافة شكل جديد مستقبلاً أمراً بسيطاً: تُنشئ فئة جديدة وتُضيفها للقائمة.

التجاوز الجزئي — Partial Override

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

main.go

super().describe() يستدعي الأسلوب من الأم ثم تُضيف الابنة معلوماتها. هذا أفضل من إعادة كتابة كل المنطق.

isinstance() وissubclass()

Python يوفر دوال للتحقق من العلاقات بين الكائنات والفئات:

main.go

ترتيب حل الأساليب — MRO

عندما تستدعي أسلوباً Python يبحث عنه بترتيب محدد يسمى Method Resolution Order (MRO). يمكن رؤيته بـ __mro__:

main.go

الـ MRO في Python يتبع خوارزمية C3 Linearization. الفكرة البسيطة: Python يبحث من اليسار لليمين في قائمة الآباء، ثم يصعد. في الوراثة البسيطة (فئة واحدة أم) لا حاجة لقلق. في الوراثة المتعددة كن حذراً واستشر __mro__ إذا اشتبهت.

تحدي — Challenge