Giả sử tôi có một giao diện FooInterface
có chữ ký sau:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Và một lớp cụ thể ConcreteFoo
thự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ử SpecialSomething
dụng các đối tượng đặc biệt trong khi cung cấp dự phòng cho SomethingInterface
cá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 đượcSpecialSomething
nó 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.