مفهوم الـ Overriding

Override: تعني تعريف الدالة التي ورثها الـ Subclass من الـ Superclass من جديد, هذه الدالة الجديدة تكون مشابهة للدالة الموروثة من حيث الشكل فقط, أي لها نفس الإسم و النوع و عدد الباراميترات, لكن محتواها مختلف.الهدف الحقيقي من الـ Overriding هو إتاحة الفرصة للـ Subclass ليعرف الدوال حسب حاجته.

مثال

لنفترض أننا قمنا بتعريف كلاس إسمه Country, يحتوي على دالة إسمها ()language.
بعدها قمنا بتعريف ثلاث كلاسات, و كلها ترث من Country, إذاً كلها ستحتوي على الدالة ()language.
هنا الفكرة أن أي كلاس يرث من Country قد يضطر إلى تعريف الدالة ()language من جديد حتى تناسبه.

} public class Country
// هنا, هذا الكلاس يعتبر الكلاس الأساسي لأي دولة في العالم, إذاً يجب أن يرثه أي كلاس يمثل دولة
} ()public void language
;(“System.out.println(“English
// هنا قمنا بوضع اللغة الإنجليزية كلغة إفتراضية لجميع البلدان
{
{

} public class Australia extends Country
// هنا لا داعي لتعريف الدالة ()language من جديد لأن اللغة الإنجليزية هي لغة أستراليا
{

} public class Oman extends Country
//  هنا يجب تعريف الدالة()language من جديد لأن اللغة الإنجليزية ليست لغة عُمان
Override@
} ()public void language
;(“System.out.println(“Arabic
{
{

} public class Spain extends Country
//  هنا يجب تعريف الدالة()language من جديد لأن اللغة الإنجليزية ليست لغة إسبانيا
Override@
} ()public void language
;(“System.out.println(“Spanish
{
{

} public class Main
} (public static void main(String[] args

// هنا قمنا بإنشاء كائنات من البلدان الثلاثة
;()Australia au = new Australia
;()Oman om= new Oman
;()Spain sp = new Spain

//هنا قمنا باستدعاء الدالة ()language لعرض لغة كل بلد
;()au.language
;()om.language
;()sp.language
{
{

سنحصل على النتيجة التالية عند التشغيل.

English
Arabic
Spanish

أنت الآن فهمت لماذا قد تحتاج أن تفعل Override. سنقوم الآن بشرح طريقة عمل مترجم جافا عندما فعلت Override للدالة ()language.

إذا عدت للكلاس Oman , ستجد أننا فعلنا Override للدالة ()language. إذاً هنا أصبح الكلاس Oman يملك دالتين إٍسمهما ()language, الأولى هي التي ورثها من الـ Superclass, و الثانية هي التي قمنا بتعريفها عندما فعلنا Override.

بما أن الكلاس Oman يملك دالتين لهما نفس الإسم, النوع و عدد البارامتيرات, كيف عرف أي دالة يختار؟

عندما قمنا بتعريف الدالة ()language من جديد في الـ Subclass, قام المترجم بإخفاء الدالة الأصلية ( أي دالة الـ Superclass ) و أظهر الدالة الجديدة فقط. بالإضافة إلى أن الكلمة Override@ ضمنت لنا حصول هذا, لأنها تخبر المترجم أنه يوجد عدة دوال إسمهم ()language لكننا نريد هذه الدالة بالتحديد عند استدعائها من هذا الكلاس.

* في داخل الكلاس Oman , إذا أردنا إستخدام الدالة ()language الموجودة في الـ Superclass و التي قام المترجم بإخفائها عندما قمنا بتعريفها من جديد.

شروط الـ Overriding للدوال

  • يجب أن يكون الـ Modifier المستخدم للدالة الجديدة هو نفسه المستخدم للدالة القديمة, و يجب أن يكون نوعه public أو protected.
  • عدد و نوع باراميترات الدالة الجديدة يجب أن يطابق عدد و نوع باراميترات الدالة القديمة.
  • نوع الإرجاع للدالة الجديدة يجب أن يكون نفس نوع الإرجاع للدالة القديمة.
  • الدالة المعرفة كـ private لا يمكن أن نفعل لها Override, لأن كلمة private تمنع إمكانية الوصول المباشر للدالة من الـ Subclass.
  • الدالة المعرفة كـ final لا يمكن أن نفعل لها Override, لأن كلمة final تمنع تغير محتوى الدالة بعد تعريفها.
  • الدالة المعرفة كـ static لا يمكن أن نفعل لها Override و لكن يمكن تعريفها من جديد في أي مكان, لأن كلمة static تجعل الدالة مشتركة بين جميع الكلاسات.