مفهوم الـ Overriding
في الدرس السابق, شاهدت كيف أن الكلاس الإبن ( Subclass ) يرث كل المتغيرات و الدوال الموجودة في الكلاس الأب ( Superclass ). و تعلمت أيضاً طريقة تطبيق مبدأ إخفاء البيانات من أجل ضمان أن لا يحدث تضارب في أسماء المتغيرات و الدوال الموجودة في الكلاس الإبن و الكلاس الأب.
مبدأ إخفاء البيانات يتيح لنا الوصول للأشياء الموجودة في الكائن سواء أصلها من الكلاس الإبن أو الكلاس الأب.
Override: تعني تعريف الدالة التي ورثها الكلاس الإبن من الكلاس الأب من جديد, هذه الدالة الجديدة تكون مشابهة للدالة الموروثة من حيث الشكل فقط, أي لها نفس الإسم و النوع و عدد الباراميترات, لكن محتواها مختلف.
إذاً, الهدف الحقيقي من الـ Overriding هو إتاحة الفرصة للكلاس الإبن لأن يعرف الدوال حسب حاجته.
في دروس لاحقة, سنرث من كلاسات جاهزة في بايثون, و نفعل Override للدوال الموجودة فيها لكي تناسب التطبيقات التي سنقوم ببنائها.
في الدرس السابق, شاهدت كيف أن الكلاس الإبن ( Subclass ) يرث كل المتغيرات و الدوال الموجودة في الكلاس الأب ( Superclass ). و تعلمت أيضاً طريقة تطبيق مبدأ إخفاء البيانات من أجل ضمان أن لا يحدث تضارب في أسماء المتغيرات و الدوال الموجودة في الكلاس الإبن و الكلاس الأب.
مبدأ إخفاء البيانات يتيح لنا الوصول للأشياء الموجودة في الكائن سواء أصلها من الكلاس الإبن أو الكلاس الأب.
Override: تعني تعريف الدالة التي ورثها الكلاس الإبن من الكلاس الأب من جديد, هذه الدالة الجديدة تكون مشابهة للدالة الموروثة من حيث الشكل فقط, أي لها نفس الإسم و النوع و عدد الباراميترات, لكن محتواها مختلف.
إذاً, الهدف الحقيقي من الـ Overriding هو إتاحة الفرصة للكلاس الإبن لأن يعرف الدوال حسب حاجته.
في دروس لاحقة, سنرث من كلاسات جاهزة في بايثون, و نفعل Override للدوال الموجودة فيها لكي تناسب التطبيقات التي سنقوم ببنائها.
شروط الـ Overriding
- لا يمكنك أن تفعل Override لدالة معرفة في الأساس بشكل خفي لأن إخفاء الأسماء يضمن عدم حدوث مشكلة في تضارب الأسماء.
- عدد و نوع باراميترات الدالة الجديدة يجب أن يطابق عدد و نوع باراميترات الدالة القديمة.
عدم تحقق هذين الشرطين يعني أنك تعرف دالة جديدة في الكلاس الإبن و الدالة التي ورثها من الكلاس الأب يستطيع الكائن الذي تنشئه من الكلاس الإبن أن يقوم باستدعائها.
- لا يمكنك أن تفعل Override لدالة معرفة في الأساس بشكل خفي لأن إخفاء الأسماء يضمن عدم حدوث مشكلة في تضارب الأسماء.
- عدد و نوع باراميترات الدالة الجديدة يجب أن يطابق عدد و نوع باراميترات الدالة القديمة.
عدم تحقق هذين الشرطين يعني أنك تعرف دالة جديدة في الكلاس الإبن و الدالة التي ورثها من الكلاس الأب يستطيع الكائن الذي تنشئه من الكلاس الإبن أن يقوم باستدعائها.
مثال
الآن لنفترض أننا قمنا بتعريف كلاس إسمه
, يحتوي على دالة إسمها .
بعدها قمنا بتعريف ثلاث كلاسات, و كلها ترث من الكلاس . إذاً كل كلاس منهم سيحتوي على الدالة .
هنا الفكرة أن أي كلاس يرث من كلاس قد يضطر إلى تعريف الدالة من جديد حتى تناسبه.
الآن لنفترض أننا قمنا بتعريف كلاس إسمه
, يحتوي على دالة إسمها .بعدها قمنا بتعريف ثلاث كلاسات, و كلها ترث من الكلاس . إذاً كل كلاس منهم سيحتوي على الدالة .
هنا الفكرة أن أي كلاس يرث من كلاس قد يضطر إلى تعريف الدالة من جديد حتى تناسبه.
مثال
سنحصل على النتيجة التالية عند تشغيل الملف
.
إذا فهمت المثال السابق جيداً, فأنت الآن فهمت حتماً لما قد تحتاج أن تفعل Override للدوال في الكلاس الإبن.
سنحصل على النتيجة التالية عند تشغيل الملف
.إذا فهمت المثال السابق جيداً, فأنت الآن فهمت حتماً لما قد تحتاج أن تفعل Override للدوال في الكلاس الإبن.
معلومة تقنية
إذا عدت للكلاس
, ستجد أننا فعلنا Override للدالة لكي تطبع كلمة بدل كلمة في حال إنشاء كائن من الكلاس و إستدعاءها منه.فعلياً, الكلاس
أصبح يملك دالتين إٍسمهما و ليس دالة واحدة كالتالي:- الأولى هي التي ورثها في الأساس من الكلاس .
- الثانية هي التي قمنا بتعريفها فيه من جديد في الكلاس ( أي عندما فعلنا Override ).
بما أن الكلاس
يملك دالتين لهما نفس الإسم و عدد الباراميترات, كيف عرف مفسّر بايثون أي دالة منهما سينفذ عند تشغيل الكود؟مفسّر بايثون يبحث في المرتبة الأولى عن الدالة التي قمت باستدعائها في الكلاس الذي تم منه إنشاء الكائن.
إذا وجد الدالة في الكلاس فإنه يقوم بتنفيذها. إن لم يجد يجدها يبحث عنها في الكلاس الأب. إن وجدها في الكلاس الأب يقوم بتنفيذها.
إذا عدت للكلاس
, ستجد أننا فعلنا Override للدالة لكي تطبع كلمة بدل كلمة في حال إنشاء كائن من الكلاس و إستدعاءها منه.فعلياً, الكلاس
أصبح يملك دالتين إٍسمهما و ليس دالة واحدة كالتالي:- الأولى هي التي ورثها في الأساس من الكلاس .
- الثانية هي التي قمنا بتعريفها فيه من جديد في الكلاس ( أي عندما فعلنا Override ).
بما أن الكلاس
يملك دالتين لهما نفس الإسم و عدد الباراميترات, كيف عرف مفسّر بايثون أي دالة منهما سينفذ عند تشغيل الكود؟مفسّر بايثون يبحث في المرتبة الأولى عن الدالة التي قمت باستدعائها في الكلاس الذي تم منه إنشاء الكائن.
إذا وجد الدالة في الكلاس فإنه يقوم بتنفيذها. إن لم يجد يجدها يبحث عنها في الكلاس الأب. إن وجدها في الكلاس الأب يقوم بتنفيذها.
ملاحظة
في الكلاس
يمكنك إستدعاء الدالة التي ورثها من الكلاس بالإعتماد على دالة إسمها .
لا تقلق إذا لم تفهم المقصود الآن لأنك ستتعرف على هذه الدالة بعد قليل.
في الكلاس
يمكنك إستدعاء الدالة التي ورثها من الكلاس بالإعتماد على دالة إسمها .لا تقلق إذا لم تفهم المقصود الآن لأنك ستتعرف على هذه الدالة بعد قليل.
الدالة
هذه الدالة تجعلك قادر على الوصول إلى الدالة المعرفة في الكلاس الأب ( Superclass ) من الكلاس الإبن ( Subclass ) سواء كان يوجد تضارب في الأسماء أو لا يوجد و بالتالي يصبح الكلاس الإبن قادر على أن يعيد كتابة الدالة التي ورثها من الكلاس الأب و أن يصل للدالة التي ورثها من الكلاس الأب أيضاً.
و بمعنى آخر فإن هذه الدالة أن تجعل المبرمج قادر على الإستفادة من الدالة الموجودة في الكلاس الأب و إضافة أشياء جديدة عليها في الكلاس الإبن.
ستتعلم من المثال التالي كيف تقوم باستدعاء الدالة
الموجودة في الكلاس الأب بشكل تلقائي من الدالة الموجودة في الكلاس الإبن.
هذه الدالة تجعلك قادر على الوصول إلى الدالة المعرفة في الكلاس الأب ( Superclass ) من الكلاس الإبن ( Subclass ) سواء كان يوجد تضارب في الأسماء أو لا يوجد و بالتالي يصبح الكلاس الإبن قادر على أن يعيد كتابة الدالة التي ورثها من الكلاس الأب و أن يصل للدالة التي ورثها من الكلاس الأب أيضاً.
و بمعنى آخر فإن هذه الدالة أن تجعل المبرمج قادر على الإستفادة من الدالة الموجودة في الكلاس الأب و إضافة أشياء جديدة عليها في الكلاس الإبن.
ستتعلم من المثال التالي كيف تقوم باستدعاء الدالة
تذكر
الباراميترات التي تعرفها بداخل الدالة
يتم تحويلها إلى خصائص للكائن الذي يتم إنشاؤه و هذه الدالة تستدعى بشكل تلقائي عند إنشاء الكائن.
الباراميترات التي تعرفها بداخل الدالة
يتم تحويلها إلى خصائص للكائن الذي يتم إنشاؤه و هذه الدالة تستدعى بشكل تلقائي عند إنشاء الكائن.مثال
الآن لنفترض أننا قمنا بتعريف كلاس إسمه
, يحتوي على خاصيّتين ( يتم إنشاؤهما في لحظة إنشاء كائن من الكلاس لأننا وضعناهما في الدالة و ) .بعدها قمنا بتعريف كلاس إسمه
يرث من الكلاس في هذا الكلاس قمنا بتعريف الدالة . من جديد و وضعنا فيها نفس الباراميترات الموجودة في الدالة التي ورثها الكلاس و أضفنا فيها باراميتر جديد إسمه .
كما أننا قمنا بتعريف دالة إسمها تعرض كل قيم الخصائص الموجودة في الكلاس.
الآن لنفترض أننا قمنا بتعريف كلاس إسمه
, يحتوي على خاصيّتين ( يتم إنشاؤهما في لحظة إنشاء كائن من الكلاس لأننا وضعناهما في الدالة و ) .بعدها قمنا بتعريف كلاس إسمه
يرث من الكلاس في هذا الكلاس قمنا بتعريف الدالة . من جديد و وضعنا فيها نفس الباراميترات الموجودة في الدالة التي ورثها الكلاس و أضفنا فيها باراميتر جديد إسمه .كما أننا قمنا بتعريف دالة إسمها تعرض كل قيم الخصائص الموجودة في الكلاس.
مثال
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.
تعليقات
إرسال تعليق