Katakanlah saya memiliki antarmuka FooInterfaceyang memiliki tanda tangan berikut:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Dan kelas konkret ConcreteFooyang mengimplementasikan antarmuka itu:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Saya ingin ConcreteFoo::doSomething()melakukan sesuatu yang unik jika melewati jenis SomethingInterfaceobjek 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 SpecialSomethingsementara memberikan cadangan untuk SomethingInterfaceobjek 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 menerimanyaSpecialSomethinghanya akan mengembalikan objek yang tidak dimodifikasi, sedangkan jika menerimaSomethingInterfaceobjek generik akan menjalankan algoritma untuk mengubahnya menjadiSpecialSomethingobjek. Karena prasyarat dan postkondisi tetap sama, saya tidak percaya kontrak telah dilanggar.