หลักการชดเชย Liskov ใช้กับคลาสที่ใช้อินเตอร์เฟสได้หรือไม่?


17

LSP ระบุว่าเรียนควรจะทดแทนสำหรับการเรียนฐานของพวกเขาหมายความว่าได้มาและฐานเรียนควรจะมีความหมายเทียบเท่า

แต่ไม่ LSP ยังนำไปใช้กับการเรียนการใช้อินเตอร์เฟซ? กล่าวอีกนัยหนึ่งถ้าวิธีการอินเทอร์เฟซที่ใช้งานโดยคลาสนั้นมีความแตกต่างทางความหมายจากสิ่งที่ผู้ใช้คาดหวังว่าจะเป็นสิ่งนี้จะถือว่าเป็นการละเมิด LSP หรือไม่?


7
ใช่. เหตุผลเดียวที่แน่นอนและผลเป็นละเมิด LSP ถ้าหากมันเป็นอินเตอร์เฟซ, ระดับนามธรรมชั้นเรียนเต็มรูปแบบไม่ได้เรื่อง LSP เป็นเรื่องเกี่ยวกับการตั้งค่าและตอบสนองความคาดหวังเพื่อให้ผู้บริโภคสามารถปฏิบัติต่อประเภทของคุณในลักษณะทั่วไป
จิมมี่ฮอฟฟา

5
โดยและขนาดใหญ่ (ฉันรู้ถึงความแตกต่าง แต่ฉันกำลังสรุปที่นี่) อินเตอร์เฟสค่อนข้างคล้ายกับคลาสนามธรรมที่บริสุทธิ์ (เทอม C ++) ดังนั้น Liskov จึงควรใช้กับอินเตอร์เฟสและคลาสที่ใช้งานมัน
Jesse C. Slicer

3
NB สูตรของ LSP ฉันคุ้นเคยกับการพูดของชนิดย่อยมากกว่าชั้นเรียนที่ได้รับและฐาน ด้วยเหตุผลที่ดีฉันถือว่าเพราะไม่มีเหตุผลใดที่เฉพาะเจาะจงเกี่ยวกับการสืบทอดและนำไปใช้เช่นเดียวกับการพิมพ์ย่อยชนิดอื่น ๆ

คำตอบ:


17

หากวิธีการอินเทอร์เฟซที่ใช้งานโดยคลาสนั้นมีความแตกต่างทางความหมายจากสิ่งที่ผู้ใช้คาดหวังว่าจะเป็นสิ่งนี้จะถือว่าเป็นการละเมิด LSP หรือไม่?

หากการใช้งานนั้นมีความหมายแตกต่างจากพฤติกรรมที่บันทึกไว้โดยค่าคงที่ของอินเทอร์เฟซและวิธีการก่อนและหลังเงื่อนไขของเมธอดนั้นคำตอบคือ "ใช่" มันจะเป็นการละเมิด LSP หลักการกำหนดกฎสำหรับสิ่งที่เป็นนามธรรมและการนำไปใช้โดยไม่ต้องให้สิ่งที่เป็นนามธรรมอยู่ในรูปของคลาส

อย่างไรก็ตามหากเราพูดถึงสิ่งที่ผู้ใช้คาดหวังคำตอบก็คือ "ไม่จำเป็น": ผู้ใช้มีสิทธิ์ได้รับความคาดหวังที่ผิด


"หากการใช้งานนั้นมีความแตกต่างทางความหมายจากพฤติกรรมที่บันทึกไว้ผ่านอินเทอร์เฟซของอินเทอร์เฟซ" คุณช่วยอธิบายเกี่ยวกับสิ่งที่คุณหมายถึงโดย "ค่าคงที่ของอินเตอร์เฟส" ได้ไหม?
user1483278

3
@ user1483278 นี่คือบทความเกี่ยวกับประเภทคงที่ บทความนี้เรียกพวกเขาว่า "Class invariants" แต่คำอธิบายนี้ใช้กับอินเตอร์เฟสเช่นกัน ค่าคงที่คือเงื่อนไขที่กำหนดไว้ที่การก่อสร้างและบำรุงรักษาตลอดอายุการใช้งานของอินสแตนซ์ ตัวอย่างเช่นถ้าอินเทอร์เฟซมีคุณสมบัติNameที่ไม่สามารถตั้งค่าได้nullดังนั้นobj.Name != nullจะกล่าวว่าเป็นค่าคงที่ของอินเทอร์เฟซนั้น
dasblinkenlight

1
โดยทั่วไปเมื่อพูดถึงค่าคงที่มันเป็นไปได้ที่จะเขียนชิ้นส่วนของรหัสเพื่อตรวจสอบว่าค่าคงที่จะได้รับการรักษาตลอดอายุการใช้งานของวัตถุ อย่างไรก็ตามโดยทั่วไปแล้วมันจะอธิบายอย่างตรงไปตรงมามากกว่าที่จะอธิบายค่าคงที่ในภาษาอังกฤษแบบธรรมดา
rwong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.