Terinspirasi oleh jawaban ini :
Prinsip Pergantian Liskov mensyaratkan itu
- 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.
Saya berharap jika seseorang akan memposting hirarki kelas yang melanggar 4 poin ini dan bagaimana menyelesaikannya.
Saya mencari penjelasan terperinci untuk tujuan pendidikan tentang bagaimana mengidentifikasi masing-masing dari 4 poin dalam hierarki dan cara terbaik untuk memperbaikinya.
Catatan:
Saya berharap untuk mengirim contoh kode untuk dikerjakan orang, tetapi pertanyaannya adalah tentang bagaimana mengidentifikasi hierarki yang salah :)
Jawaban:
Ini jauh lebih sederhana daripada kutipan yang membuatnya terdengar, seakurat itu.
Saat Anda melihat hierarki warisan, bayangkan metode yang menerima objek dari kelas dasar. Sekarang tanyakan pada diri Anda, apakah ada asumsi bahwa seseorang yang mengedit metode ini mungkin membuat yang tidak valid untuk kelas itu.
Misalnya ( awalnya terlihat di situs Paman Bob ):
Tampak cukup adil, bukan? Saya telah membuat sejenis Rectangle yang disebut Square, yang menyatakan bahwa Lebar harus sama dengan Tinggi setiap saat. Kotak adalah persegi panjang, jadi cocok dengan prinsip OO, bukan?
Tapi tunggu, bagaimana jika seseorang sekarang menulis metode ini:
Tidak keren. Tetapi tidak ada alasan bahwa penulis metode ini seharusnya tahu ada potensi masalah.
Setiap kali Anda menurunkan satu kelas dari yang lain, pikirkan tentang kelas dasar dan apa yang mungkin diasumsikan orang tentangnya (seperti "Lebar dan Ketinggian dan keduanya akan mandiri"). Kemudian pikirkan "apakah asumsi-asumsi itu tetap valid di subkelas saya?" Jika tidak, pikirkan kembali desain Anda.
sumber
Square
kelas yang melanggar mereka?