sebuah subkelompok seharusnya tidak mengubah perilaku orang tua?
Itu salah interpretasi umum dari LSP. Subkelas dapat mengubah perilaku induk, asalkan tetap benar untuk tipe induk.
Ada penjelasan panjang yang baik di Wikipedia , menyarankan hal-hal yang akan melanggar LSP:
... ada sejumlah kondisi perilaku yang harus dipenuhi oleh subtipe tersebut. Ini dirinci dalam terminologi yang menyerupai desain dengan metodologi kontrak, yang mengarah ke beberapa batasan tentang bagaimana kontrak dapat berinteraksi dengan warisan:
- Prasyarat tidak dapat diperkuat dalam subtipe.
- Postconditions tidak dapat dilemahkan dalam subtipe.
- Invarian tipe supertipe harus dipertahankan dalam subtipe.
- Batasan sejarah ("aturan sejarah"). Objek dianggap dapat dimodifikasi hanya melalui metode mereka (enkapsulasi). Karena subtipe dapat memperkenalkan metode yang tidak ada dalam supertipe, pengenalan metode ini memungkinkan perubahan status pada subtipe yang tidak diizinkan dalam supertipe. Batasan sejarah melarang ini. Itu adalah elemen novel yang diperkenalkan oleh Liskov dan Wing. Pelanggaran batasan ini dapat dicontohkan dengan mendefinisikan MutablePoint sebagai subtipe dari ImmutablePoint. Ini merupakan pelanggaran batasan sejarah, karena dalam sejarah titik Immutable, negara selalu sama setelah pembuatan, sehingga tidak bisa menyertakan riwayat MutablePoint secara umum. Namun, bidang yang ditambahkan ke subtipe dapat dimodifikasi dengan aman karena tidak dapat diamati melalui metode supertipe.
Secara pribadi, saya merasa lebih mudah untuk mengingat ini: Jika saya melihat parameter dalam metode yang memiliki tipe A, akankah seseorang yang melewati subtipe B membuat saya terkejut? Jika mereka mau maka ada pelanggaran terhadap LSP.
Apakah melempar Eksepsi merupakan kejutan? Tidak juga. Itu adalah sesuatu yang dapat terjadi kapan saja, apakah saya memanggil metode Kapal di OrderState atau Diberikan atau Dikirimkan. Jadi saya harus menjelaskannya dan itu bukan pelanggaran LSP.
Yang mengatakan , saya pikir ada cara yang lebih baik untuk menangani situasi ini. Jika saya menulis ini dalam C #, saya akan menggunakan antarmuka dan memeriksa implementasi antarmuka sebelum memanggil metode. Misalnya, jika OrderState saat ini tidak mengimplementasikan IShippable, jangan panggil metode Kirim di atasnya.
Tetapi kemudian saya juga tidak akan menggunakan pola Negara untuk situasi khusus ini. Pola keadaan jauh lebih tepat untuk keadaan aplikasi daripada keadaan objek domain seperti ini.
Jadi, singkatnya, ini adalah contoh yang buruk dari Pola Negara dan bukan cara yang sangat baik untuk menangani keadaan suatu pesanan. Tapi itu bisa dibilang tidak melanggar LSP. Dan pola Negara, dalam dan dari dirinya sendiri, tentu saja tidak.