Apakah Prinsip Substitusi Liskov juga berlaku untuk kelas yang mengimplementasikan antarmuka?

17

LSP menyatakan bahwa kelas harus dapat disubstitusikan untuk kelas dasar mereka, yang berarti kelas turunan dan kelas dasar harus setara secara semantik.

Tetapi apakah LSP juga berlaku untuk kelas yang mengimplementasikan antarmuka? Dengan kata lain, jika metode antarmuka yang diterapkan oleh suatu kelas secara semantik berbeda dari apa yang diharapkan pengguna, apakah ini akan dianggap sebagai pelanggaran LSP?

pengguna1483278
sumber
7
Iya. Alasan dan hasil yang persis sama dengan melanggar LSP jika itu merupakan antarmuka, kelas abstrak, kelas penuh, tidak masalah. LSP adalah tentang menetapkan dan memenuhi harapan untuk memungkinkan konsumen memperlakukan jenis Anda secara umum.
Jimmy Hoffa
5
Pada umumnya (saya tahu perbedaannya, tapi saya menggeneralisasi di sini), antarmuka agak analog dengan kelas abstrak murni (istilah C ++) dan oleh karena itu Liskov harus berlaku untuk antarmuka dan kelas yang mengimplementasikannya.
Jesse C. Slicer
3
NB formulasi LSP yang saya kenal berbicara tentang subtipe daripada kelas turunan dan basis. Dengan alasan yang bagus, saya berasumsi, karena tidak ada alasan khusus untuk pewarisan dan berlaku juga untuk jenis subtipe lainnya.

Jawaban:

17

jika metode antarmuka yang diterapkan oleh suatu kelas secara semantik berbeda dari apa yang diharapkan pengguna, apakah ini akan dianggap sebagai pelanggaran terhadap LSP?

Jika implementasinya berbeda secara semantik dari perilaku yang didokumentasikan melalui invarian antarmuka dan metode sebelum dan sesudah persyaratan metodenya, maka jawabannya adalah "ya", itu akan menjadi pelanggaran terhadap LSP. Prinsip ini menetapkan aturan untuk abstraksi dan implementasinya, tanpa mengharuskan sisi abstraksi hadir dalam bentuk kelas.

Namun, jika kita berbicara tentang apa yang diharapkan pengguna , jawabannya akan "tidak harus": pengguna berhak memiliki harapan yang salah.

dasblinkenlight
sumber
"Jika implementasinya secara semantik berbeda dari perilaku yang didokumentasikan melalui invarian antarmuka" Bisakah Anda menguraikan apa yang Anda maksud dengan "invarian antarmuka"?
user1483278
3
@ user1483278 Berikut adalah artikel tentang tipe invarian . Artikel menyebut mereka "Kelas invarian", tetapi deskripsi juga berlaku untuk antarmuka. Invarian adalah kondisi yang ditetapkan pada konstruksi, dan dipelihara sepanjang masa kejadian. Misalnya, jika sebuah antarmuka memiliki properti Nameyang tidak dapat diatur null, maka obj.Name != nulldikatakan invarian antarmuka itu.
dasblinkenlight
1
Biasanya ketika invarian dibahas, dimungkinkan untuk menulis sepotong kode untuk memverifikasi bahwa invarian dijunjung selama seluruh masa objek. Namun, biasanya lebih mudah untuk menggambarkan secara verbal invarian dalam bahasa Inggris.
rwong