Katakanlah saya memiliki antarmuka FooInterface
yang memiliki tanda tangan berikut:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Dan kelas konkret ConcreteFoo
yang mengimplementasikan antarmuka itu:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Saya ingin ConcreteFoo::doSomething()
melakukan sesuatu yang unik jika melewati jenis SomethingInterface
objek khusus (katakanlah itu disebut SpecialSomething
).
Ini jelas merupakan pelanggaran LSP jika saya memperkuat prasyarat metode ini atau melemparkan pengecualian baru, tetapi apakah itu masih merupakan pelanggaran LSP jika saya membuat objek yang khusus SpecialSomething
sementara memberikan cadangan untuk SomethingInterface
objek generik ? Sesuatu seperti:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()
metode ini adalah tipe konversi keSpecialSomething
: jika menerimanyaSpecialSomething
hanya akan mengembalikan objek yang tidak dimodifikasi, sedangkan jika menerimaSomethingInterface
objek generik akan menjalankan algoritma untuk mengubahnya menjadiSpecialSomething
objek. Karena prasyarat dan postkondisi tetap sama, saya tidak percaya kontrak telah dilanggar.