สมมติว่าฉันมีอินเทอร์เฟซFooInterface
ที่มีลายเซ็นต่อไปนี้:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
และคลาสรูปธรรมConcreteFoo
ที่ใช้ส่วนต่อประสานนั้น:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
ฉันต้องการConcreteFoo::doSomething()
ทำสิ่งที่ไม่ซ้ำกันหากผ่านSomethingInterface
วัตถุชนิดพิเศษ(สมมติว่ามันถูกเรียกว่าSpecialSomething
)
มันเป็นการละเมิด LSP อย่างแน่นอนถ้าฉันเพิ่มเงื่อนไขของวิธีการหรือสร้างข้อยกเว้นใหม่ แต่มันจะเป็นการละเมิด LSP หรือไม่ถ้าฉันใส่SpecialSomething
วัตถุพิเศษในขณะที่ให้ทางเลือกสำหรับSomethingInterface
วัตถุทั่วไป? สิ่งที่ต้องการ:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()
วิธีนี้คือการแปลงแบบเป็นSpecialSomething
: ถ้ามันได้รับSpecialSomething
มันก็แค่คืนวัตถุที่ไม่ได้แก้ไขในขณะที่ถ้ามันได้รับSomethingInterface
วัตถุทั่วไปมันจะเรียกใช้อัลกอริทึมในการแปลงเป็นSpecialSomething
วัตถุ เนื่องจากเงื่อนไขและ postconditions ยังคงเหมือนเดิมฉันไม่เชื่อว่าสัญญาถูกละเมิด