Prinsip penggantian Rich, OCP, sebagai prinsip tingkat tinggi OO, menganjurkan penggunaan "abstraksi" dan "polimorfisme" untuk mengubah struktur statis dalam desain menjadi struktur dinamis untuk mempertahankan selungkup desain. "Abstrak" adalah fungsi yang disediakan oleh bahasa. "Polimorfisme" diimplementasikan oleh semantik yang diwariskan.
Prinsip penggantian Richter berisi 4 makna berikut:
Sekarang kita bisa menjelaskan keempat makna di atas.
Subkelas dapat mengimplementasikan metode abstrak kelas orang tua, tetapi tidak dapat mengesampingkan metode kelas induk yang tidak beragam.
Ketika kami merancang sistem, kami sering merancang antarmuka atau kelas abstrak, dan kemudian subkelas menerapkan metode abstrak. Prinsip penggantian Richter sebenarnya digunakan di sini. Sangat mudah untuk memahami bahwa subkelas dapat mengimplementasikan metode abstrak kelas induk. Bahkan, subclass harus sepenuhnya mengimplementasikan metode abstrak kelas induk, bahkan jika mereka menulis metode kosong, jika tidak mereka akan menyusun dan melaporkan kesalahan.
Titik kunci dari prinsip substitusi Richter adalah bahwa ia tidak dapat mencakup metode non-abstrak dari kelas induk. Setiap metode yang diimplementasikan dengan baik di kelas induk sebenarnya menetapkan serangkaian spesifikasi dan kontrak. Meskipun tidak memaksa semua subclass untuk mematuhi spesifikasi ini, jika subclass secara sewenang-wenang memodifikasi metode yang tidak abstrak ini, ia akan merusak seluruh sistem warisan. Prinsip penggantian Lizur mengungkapkan makna ini.
Dalam ide desain yang berorientasi objek, mewarisi fitur ini membawa kenyamanan besar pada desain sistem, tetapi ada juga beberapa risiko yang berasal dari itu. Contoh -contoh berikut digunakan untuk menggambarkan risiko warisan. Kita perlu menyelesaikan fungsi mengurangi dua angka, dan Kelas A bertanggung jawab untuk itu.
kelas A {public int func1 (int a, int b) {return ab; }} klien kelas publik {public static void main (string [] args) {a = new a (); System.out.println ("100-50 ="+a.func1 (100, 50)); System.out.println ("100-80 ="+a.func1 (100, 80)); }} Hasil Menjalankan:
100-50 = 50100-80 = 20
Kemudian, kita perlu menambahkan fungsi baru: lengkapi penambahan dua angka, dan kemudian jumlahnya dengan 100, dan Kelas B bertanggung jawab. Artinya, Kelas B perlu menyelesaikan dua fungsi:
Dua angka dikurangi.
Tambahkan dua angka dan kemudian tambahkan 100.
Karena Kelas A telah menerapkan fungsi pertama, setelah Kelas B mewarisi Kelas A, Anda hanya perlu menyelesaikan fungsi kedua. Kodenya adalah sebagai berikut:
kelas B memperluas A {public int func1 (int a, int b) {return a+b; } public int func2 (int a, int b) {return func1 (a, b) +100; }} klien kelas publik {public static void main (string [] args) {b b = new b (); System.out.println ("100-50 ="+B.Func1 (100, 50)); System.out.println ("100-80 ="+B.Func1 (100, 80)); System.out.println ("100+20+100 ="+B.Func2 (100, 20)); }} Setelah Kelas B selesai, hasil lari:
100-50 = 150100-80 = 180100+20+100 = 220
Kami menemukan bahwa fungsi pengurangan yang awalnya berjalan biasanya memiliki kesalahan. Alasannya adalah bahwa ketika Kelas B menamai metode ini, secara tidak sengaja menulis ulang metode kelas induk, menyebabkan semua kode yang menjalankan fungsi pengurangan untuk memanggil metode penulisan ulang Kelas B, menyebabkan kesalahan dalam fungsi normal asli. Dalam contoh ini, setelah mengacu pada fungsi yang diselesaikan oleh Base Class A dan berubah menjadi Subclass B, terjadi pengecualian. Dalam pemrograman yang sebenarnya, kami sering menyelesaikan fungsi baru dengan menulis ulang metode kelas induk. Meskipun mudah untuk ditulis, penggunaan kembali seluruh sistem warisan akan relatif buruk, terutama ketika polimorfisme lebih sering digunakan, probabilitas kesalahan operasi program sangat tinggi. Jika Anda harus menulis ulang metode kelas induk, pendekatan yang lebih umum adalah: kelas induk asli dan kelas anak mewarisi kelas dasar yang lebih populer, menghapus hubungan warisan asli, dan menggunakan ketergantungan, agregasi, kombinasi dan hubungan lainnya sebagai gantinya.