Giả sử tôi có một giao diện FooInterfacecó chữ ký sau:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Và một lớp cụ thể ConcreteFoothực hiện giao diện đó:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Tôi muốn ConcreteFoo::doSomething()làm một cái gì đó độc đáo nếu nó vượt qua một loại SomethingInterfaceđối tượng đặc biệt (giả sử nó được gọi là SpecialSomething).
Đó chắc chắn là vi phạm LSP nếu tôi củng cố các điều kiện tiên quyết của phương pháp hoặc đưa ra một ngoại lệ mới, nhưng nó vẫn là vi phạm LSP nếu tôi sử SpecialSomethingdụng các đối tượng đặc biệt trong khi cung cấp dự phòng cho SomethingInterfacecác đối tượng chung ? Cái gì đó như:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()phương thức sẽ là chuyển đổi kiểu thànhSpecialSomething: nếu nhận đượcSpecialSomethingnó sẽ trả về đối tượng không bị thay đổi, trong khi nếu nhận được mộtSomethingInterfaceđối tượng chung, nó sẽ chạy thuật toán để chuyển đổi nó thànhSpecialSomethingđối tượng. Vì các điều kiện tiên quyết và hậu điều kiện vẫn giữ nguyên, tôi không tin rằng hợp đồng đã bị vi phạm.