sublcass ไม่ควรเปลี่ยนพฤติกรรมของผู้ปกครองหรือไม่
นั่นเป็นการตีความที่ผิดพลาดทั่วไปของ LSP คลาสย่อยสามารถเปลี่ยนพฤติกรรมของพาเรนต์ได้ตราบใดที่มันยังคงเป็นจริงกับประเภทพาเรนต์
มีคำอธิบายที่ดีเกี่ยวกับWikipediaซึ่งแนะนำสิ่งต่าง ๆ ที่จะเป็นการละเมิด LSP:
... มีเงื่อนไขพฤติกรรมหลายอย่างที่ประเภทย่อยจะต้องปฏิบัติตาม สิ่งเหล่านี้มีรายละเอียดในคำศัพท์ที่คล้ายกับการออกแบบโดยวิธีการทำสัญญาซึ่งนำไปสู่ข้อ จำกัด บางประการเกี่ยวกับวิธีที่สัญญาสามารถโต้ตอบกับมรดกได้:
- เงื่อนไขเบื้องต้นไม่สามารถเสริมความแข็งแกร่งในประเภทย่อย
- Postconditions ไม่สามารถลดลงได้ในประเภทย่อย
- ค่าคงที่ของซูเปอร์ไทป์จะต้องเก็บรักษาไว้ในประเภทย่อย
- ข้อ จำกัด ประวัติ ("กฎประวัติศาสตร์") วัตถุนั้นได้รับการยกย่องว่าสามารถปรับเปลี่ยนได้ด้วยวิธีการของพวกเขาเท่านั้น (encapsulation) เนื่องจากชนิดย่อยอาจแนะนำวิธีการที่ไม่ปรากฏใน supertype การแนะนำวิธีการเหล่านี้อาจอนุญาตให้มีการเปลี่ยนแปลงสถานะในชนิดย่อยที่ไม่อนุญาตใน supertype ข้อ จำกัด ประวัติห้ามสิ่งนี้ มันเป็นองค์ประกอบใหม่ที่ได้รับการแนะนำโดย Liskov และ Wing การละเมิดข้อ จำกัด นี้สามารถเป็นตัวอย่างได้โดยการกำหนด MutablePoint เป็นประเภทย่อยของ ImmutablePoint นี่เป็นการละเมิดข้อ จำกัด ด้านประวัติเพราะในประวัติศาสตร์ของจุดที่ไม่เปลี่ยนรูปแบบรัฐจะเหมือนเดิมเสมอหลังจากการสร้างดังนั้นจึงไม่สามารถรวมประวัติของ MutablePoint โดยทั่วไปได้ อย่างไรก็ตามฟิลด์ที่ถูกเพิ่มลงในชนิดย่อยอาจถูกปรับเปลี่ยนได้อย่างปลอดภัยเนื่องจากไม่สามารถสังเกตเห็นได้ด้วยวิธีการของ supertype
โดยส่วนตัวแล้วฉันคิดว่ามันง่ายกว่าที่จะจำสิ่งนี้: ถ้าฉันดูพารามิเตอร์ในวิธีที่มีประเภท A คนที่จะผ่านประเภทย่อย B จะทำให้ฉันประหลาดใจบ้างไหม? หากพวกเขาจะมีการละเมิด LSP
การขว้างข้อยกเว้นแปลกใจหรือไม่? ไม่ได้จริงๆ เป็นสิ่งที่สามารถเกิดขึ้นได้ตลอดเวลาไม่ว่าฉันจะเรียกใช้วิธีการจัดส่งบน OrderState หรือ Granted หรือ Shipped ดังนั้นฉันต้องคำนึงถึงมันและไม่ใช่การละเมิด LSP จริงๆ
ที่กล่าวว่าฉันคิดว่ามีวิธีที่ดีกว่าในการจัดการสถานการณ์นี้ ถ้าฉันเขียนสิ่งนี้ใน C # ฉันจะใช้ส่วนต่อประสานและตรวจสอบการใช้งานส่วนต่อประสานก่อนที่จะเรียกใช้เมธอด ตัวอย่างเช่นถ้า OrderState ปัจจุบันไม่ได้ใช้ IShippable อย่าเรียกใช้วิธีการจัดส่ง
แต่ฉันก็จะไม่ใช้รูปแบบของรัฐสำหรับสถานการณ์เฉพาะนี้ รูปแบบสถานะมีความเหมาะสมกับสถานะของแอปพลิเคชันมากกว่าสถานะของวัตถุโดเมนเช่นนี้
สรุปสั้น ๆ นี่เป็นตัวอย่างที่วางแผนไว้อย่างไม่ดีของรูปแบบของรัฐและไม่ใช่วิธีที่ดีเป็นพิเศษในการจัดการสถานะของคำสั่งซื้อ แต่เนื้อหาไม่ละเมิด LSP และรูปแบบของรัฐในตัวของมันเองไม่ได้แน่นอน