الميراث هو مفهوم مهم في وجوه المنحى. يعد الوراثة طريقة مهمة أخرى لتحسين إمكانية إعادة استخدام التعليمات البرمجية بالإضافة إلى التكوين. لقد رأينا في التركيب أن التركيب هو الواجهة الوظيفية لكائن يتم استدعاؤه بشكل متكرر. كما سنرى، يسمح لك الوراثة بإعادة استخدام تعريفات الفئات الموجودة.
الميراث الطبقي
عندما قمنا بتعريف فئة من قبل، بدأنا من الصفر وقمنا بتعريف كل عضو في الفصل بالتفصيل. على سبيل المثال، الطبقة البشرية التالية:
انسخ رمز الكود كما يلي:
com.classHuman
{
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
ارتفاع كثافة العمليات الخاصة؛
}
من تعريف الفئة أعلاه، يمكننا فهم جميع تفاصيل الفئة: بيانات أعضاء الفئة، وأساليب الفئة، وواجهة الفئة.
نحتاج الآن إلى تحديد فئة جديدة، مثل فئة المرأة، ونفترض أن المرأة تشبه تمامًا فئة الإنسان:
الإنسان والمرأة
يمكننا أن نبدأ من الصفر ونحدد فئة المرأة بالكامل كما كان من قبل:
انسخ رمز الكود كما يلي:
امرأة الطبقة
{
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
/**
* طريقة جديدة
*/
ولادة الإنسان العامة ()
{
System.out.println("الولادة");
العودة (الإنسان الجديد (20))؛
}
ارتفاع كثافة العمليات الخاصة؛
}
سيواجه المبرمج الكثير من المتاعب عند كتابة البرنامج أعلاه. تمت كتابة العديد من التعريفات في فئة "البشر"، لكن يتعين علينا كتابتها مرة أخرى. تضيف فئة المرأة فقط طريقة GiveBirth() جديدة (تقوم هذه الطريقة بإنشاء وإرجاع كائن بشري جديد).
باستخدام الميراث، يمكننا تجنب الازدواجية المذكورة أعلاه. دع فئة المرأة ترث من الطبقة البشرية، وستحصل فئة المرأة تلقائيًا على وظائف جميع الأعضاء العامين في الطبقة البشرية.
نستخدم الكلمة الأساسية الممتدة للإشارة إلى الميراث:
انسخ رمز الكود كما يلي:
فئة المرأة تمتد للإنسان
{
/**
* طريقة جديدة
*/
ولادة الإنسان العامة ()
{
System.out.println("الولادة");
العودة (الإنسان الجديد (20))؛
}
}
بهذه الطريقة، نوفر الكثير من الكتابة. من خلال الميراث، نقوم بإنشاء فئة جديدة، تسمى فئة مشتقة. تسمى الفئة الموروثة (الإنسان) بالفئة الأساسية (الفئة الأساسية). تستخدم الفئة المشتقة الفئة الأساسية كأساس لتعريفها الخاص، وتكمل طريقة GiveBirth() التي لم يتم تعريفها في الفئة الأساسية. ويمكن التعبير عن علاقة الميراث على النحو التالي:
الميراث: يشير السهم إلى الفئة الأساسية
يمكنك استخدام فئة الاختبار التالية للاختبار:
انسخ رمز الكود كما يلي:
اختبار الطبقة العامة
{
الفراغ العام الثابت الرئيسي (String[] args)
{
امرأة aWoman = امرأة جديدة();
aWoman.growHeight(120);
System.out.println(aWoman.getHeight());
}
}
الطبقة المشتقة
من خلال الميراث، نقوم بإنشاء فئة المرأة. يمكن تقسيم العملية برمتها إلى ثلاثة مستويات: تعريف الفئة الأساسية، وتعريف الفئة المشتقة، والاستخدام الخارجي.
مستوى تعريف الفئة الأساسية هو تحديد فئة بشكل طبيعي، مثل تعريف الفئة البشرية أعلاه.
من وجهة نظر المستخدمين الخارجيين (مثل كائن فئة Woman الذي تم إنشاؤه في فئة الاختبار)، فإن الفئة المشتقة لها واجهة خارجية موحدة:
بالنسبة للمستخدمين الخارجيين، الواجهة المذكورة أعلاه كافية. من منظور الواجهة وحدها، لا يوجد شيء مميز بشأن الفئات المشتقة.
ومع ذلك، يجب على المبرمجين توخي الحذر عند العمل على مستوى تعريفات الفئات المشتقة:
أولاً، الواجهة مختلطة: تأتي طريقتا getHeight() وgrowHeight() من الفئة الأساسية، بينما يتم تعريف طريقة GiveBirth() داخل الفئة المشتقة.
هناك المزيد من التعقيدات. لقد تمكنا سابقًا من الوصول بحرية إلى أعضاء الفصل داخل الفصل (باستخدام هذا للإشارة إلى الكائن). ومع ذلك، عندما نكون ضمن نطاق تعريف فئة المرأة، لا يمكننا الوصول إلى الأعضاء الخاصين في فئة الإنسان الأساسية. نتذكر معنى خاص: الأعضاء الخاصون مخصصون فقط للاستخدام الداخلي للفصل. فئة المرأة هي فئة جديدة تختلف عن فئة الإنسان، لذا فهي تقع خارج فئة الإنسان. في فئة مشتقة، لا يمكن الوصول إلى أعضاء خاصين من الفئة الأساسية.
لكن الشيء المثير للاهتمام هو أن طريقتي GrowHeight() وgetHeight() لا تزالان تعملان. يوضح هذا أن الأعضاء الخاصين في الفئة الأساسية موجودون، ولا يمكننا الوصول إليهم مباشرةً.
من أجل توضيح المفهوم، نحن بحاجة إلى فهم آلية توليد كائنات الفئة المشتقة. عندما نقوم بإنشاء كائن من فئة مشتقة، تقوم Java فعليًا بإنشاء كائن فئة أساسية (كائن فرعي) أولاً، وتضيف الأعضاء الآخرين المحددين بواسطة الفئة المشتقة يشكلون كائن فئة مشتقة. ما يمكن للمستخدمين الخارجيين رؤيته هو الأعضاء العامون للفئة الأساسية والفئات المشتقة. كما هو موضح أدناه:
كائنات الفئة الأساسية وكائنات الفئة المشتقة
اللون الأصفر في الصورة هو كائن الفئة الأساسية. يمكن لأعضاء الطبقة الأساسية الوصول إلى بعضهم البعض (استخدم هذا في تعريف الفئة البشرية للإشارة إلى كائن الفئة الأساسية).
الجزء الأزرق هو المحتوى الجديد للكائن المشتق، أسمي هذا الجزء الطبقة المشتقة. تشكل الأجزاء الزرقاء والصفراء معًا الكائن المشتق. يمكن لأعضاء الطبقة المشتقة الوصول إلى بعضهم البعض (وهذا في تعريف المرأة). علاوة على ذلك، يمكننا أيضًا الوصول إلى الأعضاء العامين في الطبقة الأساسية. لهذا السبب، نستخدم الكلمة الأساسية super للإشارة إلى كائن الفئة الأساسية، ونستخدم super.member لتمثيل الأعضاء الأساسيين (العامة).
عندما نكون في الطبقة المشتقة (أي عند تحديد فئة المرأة)، لا يمكننا الوصول إلى الأعضاء الخاصين بالقاعدة الحمراء. عندما نكون بالخارج، لا يمكننا الوصول إلى الأعضاء الخاصين في الطبقة الأرجوانية المشتقة ولا إلى الأعضاء الخاصين في الطبقة الأساسية الحمراء.
(الأعضاء الخاصون في الطبقة المشتقة لديهم قيود وصول، لذا تم تمييزهم بشرطة مائلة. الأعضاء الخاصون في الطبقة الأساسية لديهم معظم قيود الوصول، لذلك تم تمييزهم بشرطة مائلة متقاطعة)
Super مشابه لهذا وهو أيضًا معلمة ضمنية. عندما نكون في مستويات مختلفة من تعريف الطبقة، سيكون لهذا معاني مختلفة. كن حذرًا مع الكلمات الرئيسية this وsuper.
(لا تفرض Java استخدام هذا وsuper. يمكن لـ Java تحديد ملكية الأعضاء تلقائيًا في كثير من الحالات. لكنني أعتقد أن هذه ممارسة جيدة.)
محمي
لقد قدمنا سابقًا كلمتين رئيسيتين مرتبطتين بأذونات الوصول، خاصة وعامة، والتي تتحكم في الرؤية الخارجية للأعضاء. الآن، نقدم كلمة وصول جديدة: محمي.
الأعضاء الذين تم وضع علامة "محمي" عليهم يظهرون في هذه الفئة والفئات المشتقة منها. هذا المفهوم سهل الفهم، أي أنه يمكن الوصول إلى الأعضاء المحميين في الفئة الأساسية من خلال الطبقة المشتقة، ولكن لا يمكن الوصول إليها من الخارج، كما هو موضح أدناه:
تجاوز الطريقة
تتكون الواجهة الخارجية لكائن الفئة المشتقة في النهاية من الأعضاء العامين لكائن الفئة الأساسية والأعضاء العامين للطبقة المشتقة. إذا كان الأعضاء العامون في الفئة الأساسية والأعضاء العامون في الطبقة المشتقة لديهم نفس الاسم، فما هو الاسم الذي سيتم عرضه في واجهة Java؟
لقد ذكرنا بالفعل في المنشئات والتحميل الزائد للطرق أن Java تستخدم كلاً من اسم الطريقة وقائمة المعلمات لتحديد الطريقة التي سيتم استدعاؤها. يتم تحديد الطريقة من خلال اسم الطريقة وقائمة المعلمات. في المشكلة المذكورة أعلاه، إذا كانت أسماء الطرق هي نفسها ولكن قوائم المعلمات مختلفة، فسيتم تقديم الطريقتين إلى الواجهة في نفس الوقت، وهذا لن يسبب لنا أي مشكلة. عند إجراء مكالمة خارجية، ستقرر Java الطريقة التي سيتم استخدامها (طريقة التحميل الزائد) بناءً على المعلمات المتوفرة.
ماذا لو كان اسم الطريقة وقائمة المعلمات متماثلين؟ عند اشتقاق الطبقة، يمكننا أيضًا استخدام super وthis لتحديد الطريقة التي تنتمي إليها. عندما تكون خارجية، فإننا نقدم واجهة موحدة فقط، لذلك لا يمكننا توفير طريقتين في نفس الوقت. في هذه الحالة، ستعرض Java أساليب الطبقة المشتقة بدلاً من أساليب الطبقة الأساسية.
تسمى هذه الآلية طريقة التجاوز. يمكن استخدام تجاوزات الطريقة بشكل جيد لتعديل أساليب أعضاء الفئة الأساسية. على سبيل المثال، في الطبقة المشتقة، عند تعريف المرأة، يمكنك تعديل طريقة التنفس () التي توفرها الفئة الأساسية:
انسخ رمز الكود كما يلي:
فئة المرأة تمتد للإنسان
{/**
* طريقة جديدة
*/
ولادة الإنسان العامة ()
{
System.out.println("الولادة");
العودة (الإنسان الجديد (20))؛
}
/**
* تجاوز Human.breath ()
*/
التنفس الفراغي العام ()
{
super.breath();
System.out.println("سو...");
}
}
لاحظ أننا في الطبقة المشتقة في هذا الوقت ولا يزال بإمكاننا استدعاء طريقة التنفس () لكائن الفئة الأساسية من خلال super. عندما نستدعي فئة المرأة خارجيًا، نظرًا لتجاوز الطريقة، لم يعد بإمكاننا استدعاء طريقة كائن الفئة الأساسية.
يحافظ تجاوز الطريقة على واجهة كائن الفئة الأساسية ويستخدم تنفيذ الطبقة المشتقة.
منشئ
بعد فهم مفاهيم كائنات الفئة الأساسية والطبقات المشتقة، يصبح فهم طرق إنشاء الفئات المشتقة أسهل.
نحتاج إلى تحديد مُنشئ يحمل نفس اسم الفئة في تعريف الفئة المشتقة. في هذا المنشئ:
1. نظرًا لأنه يتم إنشاء كائن الفئة الأساسية وتهيئته أولاً عند إنشاء كائن مشتق، فيجب استدعاء مُنشئ الفئة الأساسية أولاً. يمكننا استخدام عبارة super(argument list) لاستدعاء مُنشئ الفئة الأساسية.
2. بعد إنشاء كائن الفئة الأساسية، ابدأ في بناء الطبقة المشتقة (تهيئة أعضاء الطبقة المشتقة). هذا هو نفس أسلوب البناء العام، راجع طريقة البناء وطريقة التحميل الزائد
على سبيل المثال، في البرنامج التالي، الطبقة البشرية لديها منشئ:
انسخ رمز الكود كما يلي:
com.classHuman
{
/**
* منشئ
*/
الإنسان العام (كثافة العمليات ح)
{
this.height = h;
}
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
ارتفاع كثافة العمليات الخاصة؛
}
تعريف الطبقة المشتقة فئة المرأة وطريقة بنائها:
انسخ رمز الكود كما يلي:
فئة المرأة تمتد للإنسان
{
/**
* منشئ
*/
المرأة العامة (كثافة العمليات ح)
{
super(h); // مُنشئ الفئة الأساسية
System.out.println("مرحبا باندورا!");
}
/**
* طريقة جديدة
*/
ولادة الإنسان العامة ()
{
System.out.println("الولادة");
العودة (الإنسان الجديد (20))؛
}
/**
* تجاوز Human.breath ()
*/
التنفس الفراغي العام ()
{
super.breath();
System.out.println("سو...");
}
}
تلخيص
يمتد
تجاوز الأسلوب
محمي
سوبر عضو، سوبر ()