التعريف 1: إذا كان لكل كائن O1 من النوع T1 كائن O2 من النوع T2 ، بحيث لا تتغير جميع البرامج المحددة في T1 في السلوك عندما يتم استبدال جميع الكائنات O1 بـ O2 ، ثم النوع T2 هو نوع فرعي من النوع T1.
التعريف 2: يجب أن تكون جميع الأماكن التي تشير إلى الفئات الأساسية قادرة على استخدام كائنات فئاتها الفرعية بشفافية.
أصل المشكلة: هناك وظيفة P1 ، والتي يتم الانتهاء منها بواسطة الفئة A. الآن من الضروري توسيع الوظيفة P1 ، والوظيفة الموسعة هي P ، حيث تتكون P من الوظيفة الأصلية P1 والوظيفة الجديدة P2. يتم الانتهاء من الوظيفة الجديدة P بواسطة الفئة الفرعية B من الفئة الفرعية B الفرعية B قد تتسبب في فشل الوظيفة الأصلية P1 أثناء إكمال الوظيفة الجديدة P2.
الحل: عند استخدام الميراث ، اتبع مبدأ استبدال ريختر. عندما يرث الفئة B الفئة A ، بالإضافة إلى إضافة طرق جديدة لإكمال الوظيفة الجديدة P2 ، حاول عدم إعادة كتابة أساليب الفئة A ، وحاول عدم زيادة تحميل طرق الفئة الأصل A.
يحتوي الميراث على معنى: أي طريقة تم تنفيذها في فئة الوالدين (بالنسبة إلى الأساليب التجريدية) هي في الواقع وضع سلسلة من المواصفات والعقود. على الرغم من أنها لا تجبر جميع الفئات الفرعية على الامتثال لهذه العقود ، إذا تعدلت الفئة الفرعية بشكل تعسفي هذه الأساليب غير المجردة ، فإنها ستضر بنظام الميراث بأكمله. مبدأ استبدال ليزور يعبر عن هذا المعنى.
إن الميراث ، باعتباره أحد الميزات الثلاثة الموجهة نحو الكائنات الرئيسية ، يجلب راحة كبيرة للبرمجة ، ولكنه يجلب أيضًا عيوب. على سبيل المثال ، سيؤدي استخدام الميراث إلى جلب الغزو إلى البرنامج ، وسيقلل قابلية نقل البرنامج ، وزيادة الاقتران بين الكائنات. إذا تم توريث فئة من قبل فئات أخرى ، عندما تحتاج هذه الفئة إلى تعديل ، يجب أخذ جميع الفئات الفرعية في الاعتبار. بعد تعديل الفئة الأصل ، قد تفشل جميع الوظائف التي تتضمن فئات فرعية.
مثال:
مستطيل الطبقة العامة {int width ؛ ارتفاع int المستطيل العام (int w ، int h) {width = w ؛ الارتفاع = ح ؛ } public int getarea () {return width*height ؛ }} الفئة العامة مربع يمتد المستطيل {square public (int w ، int h) {super (w ، h) ؛ } public int getarea () {return width*width ؛ }} اختبار الفئة العامة {public static void main (string [] args) {rectangle rectangle = new rectangle (10 ، 20) ؛ // مربع مستطيل = مربع جديد (10 ، 20) ؛ System.out.println ("المنطقة:"+rectangle.getarea ()) ؛ }}
إذا استبدلنا مستطيل فئة المستطيل بمربع الفئة المربعة ، فإن المنطقة التي وجدناها غير صحيحة لأننا نعيد كتابة طريقة getarea للفئة الأصل عند الوراثة. هذا ينتهك مبدأ الاستبدال الليسي.
بالطبع ، إليك مجرد مثال ، لن نقوم بتعديل هذا في المشاريع الفعلية.
تلخيص:
1. حاول عدم إعادة كتابة طريقة الفئة الأصل ، ولكن أضف أساليبك الفريدة.
2. في حين أن الميراث يجلب راحة كبيرة للبرمجة ، فإنه يجلب أيضا عيوب. إذا تم توريث فئة من قبل فئات أخرى ، عندما تحتاج هذه الفئة إلى تعديل ، يجب أخذ جميع الفئات الفرعية في الاعتبار. بعد تعديل الفئة الأصل ، قد تحتوي جميع الوظائف التي تتضمن فئات فرعية على أخطاء.