สมมติว่าฉันมีอินเทอร์เฟซ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 ยังคงเหมือนเดิมฉันไม่เชื่อว่าสัญญาถูกละเมิด