Definisi 1: Jika untuk setiap objek O1 tipe T1 ada objek O2 tipe T2, sehingga semua program p yang didefinisikan dalam T1 tidak memiliki perubahan perilaku ketika semua objek O1 diganti dengan O2, kemudian Type T2 adalah subtipe tipe T1.
Definisi 2: Semua tempat yang mengacu pada kelas dasar harus dapat menggunakan objek subkelasnya secara transparan.
Asal usul masalah: Ada fungsi P1, yang diselesaikan oleh Kelas A. Sekarang perlu untuk memperluas fungsi P1, dan fungsi yang diperluas adalah P, di mana P terdiri dari fungsi asli P1 dan fungsi baru P2. Fungsi baru P diselesaikan oleh subclass B dari Kelas A. Subclass B dapat menyebabkan fungsi asli P1 gagal saat menyelesaikan fungsi baru P2.
Solusi: Saat menggunakan warisan, ikuti prinsip penggantian Richter. Ketika kelas B mewarisi kelas A, selain menambahkan metode baru untuk menyelesaikan fungsi baru P2, cobalah untuk tidak menulis ulang metode orang tua kelas A, dan cobalah untuk tidak membebani metode kelas induk A.
Warisan berisi makna: metode apa pun yang telah diimplementasikan di kelas induk (relatif terhadap metode abstrak) sebenarnya menetapkan serangkaian spesifikasi dan kontrak. Meskipun tidak memaksa semua subkelas untuk mematuhi kontrak-kontrak ini, jika subclass secara sewenang-wenang memodifikasi metode non-abstrak ini, ia akan merusak seluruh sistem warisan. Prinsip penggantian Lizur mengungkapkan makna ini.
Warisan, sebagai salah satu dari tiga fitur utama yang berorientasi objek, membawa kenyamanan besar untuk pemrograman, tetapi juga membawa kelemahan. Misalnya, menggunakan warisan akan membawa invasif ke program, portabilitas program akan berkurang, dan meningkatkan kopling antar objek. Jika kelas diwarisi oleh kelas lain, ketika kelas ini perlu dimodifikasi, semua subkelas harus dipertimbangkan. Setelah kelas induk dimodifikasi, semua fungsi yang melibatkan subclass mungkin gagal.
contoh:
Kelas Publik Rectangle {int lebar; tinggi int; persegi panjang publik (int w, int h) {width = w; tinggi = h; } public int getarea () {return width*tinggi; }} public class square memperluas persegi panjang {public square (int w, int h) {super (w, h); } public int getarea () {return width*width; }} tes kelas publik {public static void main (string [] args) {rectangle rectangle = rectangle baru (10, 20); // persegi persegi = persegi baru (10, 20); System.out.println ("Area:"+rectangle.getarea ()); }}
Jika kami mengganti persegi panjang kelas persegi panjang dengan kotak kelas persegi, area yang kami temukan salah karena kami menulis ulang metode GETAREA dari kelas induk saat mewarisi. Ini melanggar prinsip penggantian Lissian.
Tentu saja, di sini hanya sebuah contoh, kami tidak akan memodifikasi ini dalam proyek aktual.
Meringkaskan:
1. Cobalah untuk tidak menulis ulang metode kelas induk, tetapi tambahkan metode unik Anda sendiri.
2. Sementara warisan membawa kenyamanan besar untuk pemrograman, itu juga membawa kelemahan. Jika kelas diwarisi oleh kelas lain, ketika kelas ini perlu dimodifikasi, semua subkelas harus dipertimbangkan. Setelah kelas induk dimodifikasi, semua fungsi yang melibatkan subclass mungkin memiliki bug.