คำจำกัดความที่ 1: หากสำหรับแต่ละวัตถุ O1 ของ Type T1 มีวัตถุ O2 ของ Type T2 ดังนั้นโปรแกรมทั้งหมดที่กำหนดไว้ใน T1 จะไม่มีการเปลี่ยนแปลงพฤติกรรมเมื่อวัตถุทั้งหมด O1 ถูกแทนที่ด้วย O2 ดังนั้น Type T2 จะเป็นชนิดย่อยของ T1
คำจำกัดความที่ 2: สถานที่ทั้งหมดที่อ้างถึงคลาสพื้นฐานจะต้องสามารถใช้วัตถุของคลาสย่อยได้อย่างโปร่งใส
ต้นกำเนิดของปัญหา: มีฟังก์ชั่น P1 ซึ่งเสร็จสมบูรณ์โดยคลาส A ตอนนี้จำเป็นต้องขยายฟังก์ชั่น P1 และฟังก์ชั่นเพิ่มเติมคือ P ซึ่ง P ประกอบด้วยฟังก์ชั่นดั้งเดิม P1 และฟังก์ชั่นใหม่ P2 ฟังก์ชั่นใหม่ P เสร็จสมบูรณ์โดย subclass B ของคลาส A. subclass B อาจทำให้ฟังก์ชันดั้งเดิม P1 ล้มเหลวในขณะที่เสร็จสิ้นฟังก์ชั่นใหม่ P2
วิธีแก้ปัญหา: เมื่อใช้การสืบทอดให้ทำตามหลักการของการเปลี่ยนริกเตอร์ เมื่อคลาส B สืบทอดคลาส A นอกเหนือจากการเพิ่มวิธีการใหม่เพื่อทำฟังก์ชั่นใหม่ P2 ให้เสร็จสมบูรณ์แล้วพยายามอย่าเขียนวิธีการของคลาส Parent Class A ใหม่และพยายามอย่าให้โอเวอร์โหลดวิธีการของคลาส Parent Class A A.
การสืบทอดมีความหมายของ: วิธีการใด ๆ ที่ได้นำไปใช้ในคลาสหลัก (สัมพันธ์กับวิธีนามธรรม) จริง ๆ แล้วการตั้งค่าชุดของข้อกำหนดและสัญญา แม้ว่ามันจะไม่บังคับให้คลาสย่อยทั้งหมดให้สอดคล้องกับสัญญาเหล่านี้หากคลาสย่อยโดยพลการปรับเปลี่ยนวิธีการที่ไม่ได้รับการรับรองเหล่านี้โดยพลการมันจะสร้างความเสียหายให้กับระบบการสืบทอดทั้งหมด หลักการของการทดแทน Lizur เป็นการแสดงออกถึงความหมายนี้
การสืบทอดซึ่งเป็นหนึ่งในสามคุณสมบัติที่มุ่งเน้นวัตถุสำคัญนำมาซึ่งความสะดวกสบายในการเขียนโปรแกรม แต่ยังนำข้อเสีย ตัวอย่างเช่นการใช้มรดกจะนำการรุกรานไปสู่โปรแกรมความสามารถในการพกพาของโปรแกรมจะลดลงและเพิ่มการมีเพศสัมพันธ์ระหว่างวัตถุ หากคลาสได้รับการสืบทอดโดยคลาสอื่น ๆ เมื่อคลาสนี้จำเป็นต้องได้รับการแก้ไขคลาสย่อยทั้งหมดจะต้องนำมาพิจารณา หลังจากการแก้ไขคลาสหลักแล้วฟังก์ชั่นทั้งหมดที่เกี่ยวข้องกับคลาสย่อยอาจล้มเหลว
ตัวอย่าง:
รูปสี่เหลี่ยมผืนผ้าระดับสาธารณะ {ความกว้าง int; ความสูง int; สี่เหลี่ยมผืนผ้าสาธารณะ (int w, int h) {width = w; ความสูง = h; } public int getArea () {return width*ความสูง; }} Public Class Square ขยายสี่เหลี่ยมผืนผ้า {public Square (int w, int h) {super (w, h); } public int getArea () {return width*width; }} การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สี่เหลี่ยมผืนผ้าสี่เหลี่ยม = สี่เหลี่ยมใหม่ (10, 20); // สี่เหลี่ยมสี่เหลี่ยม = สี่เหลี่ยมใหม่ (10, 20); System.out.println ("พื้นที่:"+rectangle.getarea ()); -
หากเราเปลี่ยนสี่เหลี่ยมชั้นสี่เหลี่ยมผืนผ้าด้วยสแควร์สแควร์สแควร์พื้นที่ที่เราพบนั้นไม่ถูกต้องเพราะเราเขียนวิธี getArea ของคลาสแม่เมื่อสืบทอด นี่เป็นการละเมิดหลักการของการเปลี่ยนลิสเซียน
แน่นอนนี่เป็นเพียงตัวอย่างเราจะไม่แก้ไขสิ่งนี้ในโครงการจริง
สรุป:
1. พยายามอย่าเขียนวิธีการคลาสแม่ แต่เพิ่มวิธีการที่ไม่ซ้ำกันของคุณเอง
2. ในขณะที่มรดกนำมาซึ่งความสะดวกสบายในการเขียนโปรแกรมมันก็นำข้อเสีย หากคลาสได้รับการสืบทอดโดยคลาสอื่น ๆ เมื่อคลาสนี้จำเป็นต้องได้รับการแก้ไขคลาสย่อยทั้งหมดจะต้องนำมาพิจารณา หลังจากการแก้ไขคลาสหลักแล้วฟังก์ชั่นทั้งหมดที่เกี่ยวข้องกับคลาสย่อยอาจมีข้อบกพร่อง