لماذا يجب أن نكون حذرين في استخدام الميراث في JAVA

موضوع هذه المادة لا تشجع على استخدام الميراث، ولكن فقط من استخدام مشاكل الميراث التي تسببها بدأت مناقشة آلية الميراث يست لطيفة جدا، لذلك اختر بعناية عند استخدامها لتجنب حفرة قد تواجهها.

يستخدم جافا ليرث سيكون لا يمكن تجنبها عيبان:

  • كسر التغليف، اعتمادا على تفاصيل تنفيذ فرعية من الطبقة السوبر، الطبقة المتفوقة واقتران.
  • بعد الفائقة التحديث قد يؤدي إلى وجود خطأ.
  • ورثت التغليف العاجلة

    في هذا الصدد، وفيما يلي مثال مفصل (من جاوة الفعالة المادة 16)

    الطبقة العامة MyHashSet < E >  يمتد HashSet < E >  { خاص كثافة addCount = 0؛ الباحث العام getAddCount () { العودة addCount. } Override إضافة منطقية العامة (E ه) { addCount ++؛ العودة super.add (ه)؛ } Override addAll منطقية الجمهور (مجموعة < ؟ يمدد E >  ج) { addCount + = c.size ()؛ عودة super.addAll (ج)؛ } }

    هنا تخصيص HashSet، كتابة الطريقتين، والمتفوقة في الفرق الوحيد هو إدراج عداد تستخدم لحساب عدد العناصر المضافة.

    إرسال بريد اختبار لاختبار ما إذا كانت تعمل هذه الميزة الجديدة:

    الطبقة العامة MyHashSetTest { MyHashSet الخاص < عدد صحيح >  myHashSet = MyHashSet جديدة < عدد صحيح > ()؛ Test اختبار باطلة العامة () { myHashSet.addAll (Arrays.asList (1،2،3))؛ System.out.println (myHashSet.getAddCount ())؛ } }

    بعد العملية سوف تجد أن إضافة العناصر الثلاثة، وقيمة الانتاج العداد 6 هي.

    في طريقة addAll الفائقة () سوف تجد سبب الخطأ: ويسمى ذلك إضافة داخليا طريقة (). حتى في هذا الاختبار، وaddAll إلى الأسلوب فئة فرعية ()، وعدد من الأجهزة زائد 3، ثم استدعاء addAll الفائقة ()، فإن addAll الفائقة () استدعاء فئة فرعية الاعلان () ثلاث مرات، ثم مضادة سوف ثلاثة آخرين.

    جذور المشكلة

    مجردة عن هذه الحالة، يمكنك أن تجد خطأ موجود لأن الفائقة يمكن تغطيتها الاستخدام الشخصي لل (وهذا هو، الطبقة المتفوقة يمكن تغطيتها في طرق أخرى يمكن أن نطلق تغطية)، في هذا الوقت إذا كانت الطبقة الطفل يتجاوز بعض من هذه الأساليب، فإنه قد يؤدي إلى أخطاء.

    FIG سبيل المثال على الحالة هذه، والطبقة الأب لديه أساليب يمكن أن تغطي A و B طريقة، A و B. يسمى ابن فرعية يتجاوز الأسلوب B، في هذا الوقت إذا كان الطفل يدعو رثت أسلوب فئة A، المكالمات الأسلوب لن يكون Father.B ()، ولكن طريقة Son.B فرعية (). إذا كانت صحة البرنامج يعتمد على Father.B () في بعض العمليات، ولكن Son.B () كتابة هذه العمليات، فإنه قد يسبب حدث خطأ.

    وهذه النقطة هي لا يبدو أن صياغة فرعية على الأرجح من السطح العلوي للمشكلة، ولكن سيكون من الخطأ، مما اضطر للمطورين لفهم تفاصيل التنفيذ الفائقة، وبالتالي كسر التغليف وجوه المنحى، منذ مطلوب التغليف لاخفاء تفاصيل التنفيذ. قد لا تكون أكثر خطورة هو الخطأ قادرة على اختبار بسهولة إذا كان للمطورين لا يفهمون تفاصيل التنفيذ الفائقة إلى إعادة صياغة، فإنه قد المشاكل المحتملة.

    قد تحدث أخطاء عند الفائقة التحديث

    هذا ومن المعلوم أفضل، وهناك عدة احتمالات:

    • الفائقة تغيير التوقيع الطرق الحالية. فإنه يؤدي إلى خطأ الترجمة.
    • وأضاف طريقة الفائقة:
    • وطرق توقيع لديها نفس فئة فرعية ولكن أنواع الإرجاع مختلفة، يؤدي إلى خطأ الترجمة.
    • ولديه توقيع من نفس فئة فرعية، يمكن أن يسبب فرعية تكرار غير مقصود، والعودة إلى الحالة الأولى.
    • فرعية وخالية من الصراعات، ولكن قد يؤثر على صحة البرنامج. على سبيل المثال، فئة فرعية من عناصر لجمع يجب أن تستوفي شروطا معينة، وهذه المرة إذا الفائقة دون الحاجة إلى الانضمام إلى عنصر الكشف يمكن إدراجها مباشرة في طريقة، صحة البرنامج على تهديد.

    تصميم الطبقة القابلة للتوريث

    ويمكن استخدامه لتصميم فئة يرث، وتجدر الإشارة إلى ما يلي:

    • للاستخدام الشخصي من الطريقة الحالية قد تغطي يجب استدعاء التفاصيل مع وثيقة وصف دقيق.
    • كما يتعرض بعض أعضاء المحمية، وإلا فإنه سوف يتعرض إلى الكثير من التفاصيل التنفيذ.
    • ويمكن تغطية منشئ ألا تتذرع بأي طريقة.

    شرح بالتفصيل في إطار النقطة الثالثة. فعلا كسر مسألة الخلافة ومناقشة التغليف هي مشابهة جدا، والنظر في التعليمة البرمجية التالية:

    فئة العمومي الأب { الجمهور الأب () { someMethod ()؛ } someMethod الفراغ الجمهور () { } } فئة العمومي ابن يمتد الأب { تاريخ التسجيل الخاص؛ الجمهور الابن () { this.date = تاريخ جديد ()؛ } Override someMethod الفراغ الجمهور () { System.out.println ( "تايم =" + date.getTime ())؛ } }

    رمز أعلاه عند تشغيل الاختبارات سوف يرمي NullPointerException:

    الطبقة العامة SonTest { ابن الابن الخاص = الابن جديد ()؛ Test اختبار باطلة العامة () { son.someMethod ()؛ } }

    لأنه سيتم تشغيل منشئ الفائقة لأول مرة أمام فرعية منشئ، منشئ الفائقة هنا على someMethod () لديه الاعتماد، في حين يتم إعادة كتابة someMethod () بحيث منشئ الفائقة وسيتم استدعاؤه ل في المرة Son.someMethod ()، ولكن هذه المرة لم تتم تهيئة الطبقة الفرعية، ثم تشغيل لdate.getTime () رمي استثناء لاغية المؤشر.

    لذلك، إذا كان هناك من الاعتماد على أساليب قد تكون خاطئة المشمولة في منشئ الفائقة، ثم في الميراث.

    استنتاج

    الميراث العديد من المزايا، ولكن يجب توخي الحذر عند استخدام الميراث وإعطاء المزيد من الاهتمام. تستخدم أيضا لتحقيق إعادة استخدام التعليمات البرمجية هناك مجمع إذا كنت تستخدم الميراث ومركب JIEKE (وهذا هو المنطلق) ، ثم ينبغي أن تكون الأولوية لاستخدام المجمع، لأن مركب يمكن أن تظل محمية تفاصيل التنفيذ الطبقة المتفوقة من أوجه القصور فيما يتعلق بالميراث يمكن استخدامها لتجنب تعقيدا. وهذا ما يسمى أيضا أسبقية المركبة على الميراث .

    إذا كنت تستخدم الميراث، يجب إيلاء الاهتمام لإعادة كتابة أساليب موجودة لتغطية استخدام الشخصي من الدرجة الفائقة قد تكون خاطئة، إن لم يكن إعادة كتابة، عندما التحديث الفائقة قد يعرض أيضا أخطاء. وينبغي أيضا أن تكون الطبقة السوبر مصممة تصميما جيدا أن يوفر وثائق مفصلة من أي غطاء كل استدعاء الأسلوب.

    سكين حلقة عرف: B الله أوضح مضض فريق الشاي أربع مباريات متتالية، RNG الحروب الخارجية، وارتفاع السائل ليان تشان نائب الرئيس

    190316 Wangjun كاي للذهاب الى العمل اليوم، بدأ رويترز منعش بارد أشعة الشمس الولد انها

    "صيف فقاعة" خاتمة: انهيار أوروبا تشن شيا مو لمغادرة، وقالت انها أوكلت إلى لوه شي

    34 الكهربائي مخطط السيطرة الأسلاك، والمكونات الإلكترونية مبدأ التشغيل

    أطلقت باندورا باندورا الصين السلسلة الأولى، "الخوخ طويل" إزهار كامل من الحب

    LOL: GRF معارك Gen.G، محتدما سباق العام الماضي عندما افتدى الانتقام

    "GOT7" "مشاركة" 190316 Yeongdeungpo في توقيع الأرز تبادل لاطلاق النار معاينة JUS2 الجماعي جهد الذاتي الأعمال تحلق

    "الحب الشقق" تعزيز أغنية MV على الانترنت، أصدقاء: أنا السنوات العشر من الشباب، وتذهب نحو لم تنته

    الدراما الولايات المتحدة "الكون نسبي" إذا كان هناك عالم لك، هل أنت على استعداد لمبادلة حياته؟

    تولى ممن لهم للبحث X، يطرق باب المستقبل

    رعب! غرفة توزيع 3 أشخاص تصبح على الفور بقايا المتفجرات، وثمانية أنواع من المخاطر التي سألت نفسك حتى الآن؟

    التقدير DOTA2 من المجوهرات: هؤلاء اللاعبين أعلى مرساة المجوهرات