Video: Evolution All Stars at STIM YKPN 2011 2024
Konsep pewarisan, dan karenanya anjak piutang, di C ++ memungkinkan satu kelas mewarisi sifat kelas dasar. Warisan memiliki sejumlah tujuan; Manfaat utama warisan adalah kemampuan untuk menunjukkan hubungan antar kelas. Ini adalah apa yang disebut hubungan IS_A - MicrowaveOven IS_A Oven dan hal-hal seperti itu.
Anjak adalah hal yang bagus jika Anda membuat korelasi yang benar. Misalnya, microwave versus hubungan oven konvensional nampaknya alami. Klaim bahwa microwave adalah jenis pemanggang roti khusus, dan Anda menuju masalah. Benar, mereka berdua membuat hal-hal menjadi panas, mereka berdua menggunakan listrik, dan keduanya sama-sama ditemukan di dapur, namun kemiripannya berakhir di sana - microwave tidak bisa membuat roti panggang dan pemanggang roti tidak bisa membuat nachos.
Mengidentifikasi kelas yang melekat dalam masalah dan menggambar hubungan yang benar di antara kelas-kelas ini adalah proses yang dikenal sebagai anjak 999. (Kata itu terkait dengan aritmatika yang harus Anda lakukan di sekolah dasar: memberikan penjelasan tentang penyebut yang paling umum, misalnya, 12 sama dengan 2 kali 2 kali 3.) Inilah cara yang dapat Anda gunakan warisan untuk menyederhanakan program Anda menggunakan contoh rekening bank. Misalkan Anda diminta untuk menulis sebuah program bank sederhana yang menerapkan konsep rekening tabungan dan rekening giro.
Memeriksa dan Simpan di ditunjukkan pada gambar ini. (Ini hanya salah satu dari beberapa cara untuk mengungkapkan hal yang sama secara grafis.) Memeriksa
dan Tabungan. "> Kelas independen Memeriksa dan Tabungan. Untuk membaca gambar ini dan tokoh lainnya, ingat yang berikut ini:
-
Nama dalam kotak adalah fungsi anggota.
-
Nama yang tidak ada dalam kotak adalah data anggota.
-
Nama-nama yang meluas keluar dari kotak adalah anggota yang dapat diakses oleh umum; Artinya, anggota ini dapat diakses oleh fungsi yang bukan bagian dari kelas atau keturunannya. Anggota yang benar-benar berada di dalam kotak tidak dapat diakses dari luar kelas.
-
Panah tebal mewakili hubungan IS_A.
-
Panah tipis mewakili hubungan HAS_A.
-
Kendaraan Mobil IS_A
, tapi Mobil HAS_A Motor . Anda dapat melihat pada gambar pertama bahwa kelas
Memeriksa dan memiliki banyak kesamaan. Misalnya, kedua kelas memiliki fungsi penarikan () dan deposit () anggota.Karena kedua kelas itu tidak identik, bagaimanapun, mereka harus tetap sebagai kelas terpisah. (Dalam aplikasi bank real-life, kedua kelas akan jauh lebih berbeda daripada contoh ini.) Tetap saja, seharusnya ada cara untuk menghindari pengulangan ini. Anda bisa mendapatkan salah satu kelas ini dari yang lain. Tabungan
memiliki lebih banyak anggota daripada Memeriksa, sehingga Anda bisa membiarkan Tabungan mewarisi dari Memeriksa. Pengaturan ini ditunjukkan pada gambar berikut. Kelas Tabungan
mewarisi semua anggota. Kelas dilengkapi dengan penambahan data member noWithdrawals dan dengan mengesampingkan fungsi withdrawal () . Anda harus mengganti penarikan () karena aturan untuk menarik uang dari rekening tabungan berbeda dari yang menarik uang dari rekening giro. Tabungan diterapkan sebagai subkelas
Memeriksa. "> Tabungan diterapkan sebagai subkelas Memeriksa. Meskipun membiarkan Tabunganyang diwarisi dari Memeriksa adalah pekerjaan, itu tidak sepenuhnya memuaskan. Masalah utamanya adalah, seperti berat yang tercantum pada SIM saya, itu salah mengartikan kebenaran. Hubungan pewarisan ini menyiratkan bahwa rekening tabungan adalah jenis rekening giro khusus, yang sebenarnya tidak. Pernyataan keliru semacam itu membingungkan programmer, baik hari ini maupun hari esok. Suatu hari nanti, programmer yang tidak terbiasa dengan trik pemrograman kita harus membaca dan memahami apa kode kita. Representasi yang menyesatkan sulit untuk didamaikan dan dipahami. Selain itu, misrepresentasi semacam itu dapat menyebabkan masalah di jalan. Misalkan, misalnya, bahwa bank mengubah kebijakannya berkenaan dengan rekening giro. Katakanlah bahwa mereka memutuskan untuk mengenakan biaya layanan untuk mengecek rekening hanya jika saldo minimum turun di bawah nilai tertentu selama bulan tersebut.
Perubahan seperti ini dapat dengan mudah ditangani dengan sedikit perubahan pada kelas
Checking.
Anda harus menambahkan anggota data baru ke kelas Memeriksa untuk mencatat saldo minimum selama bulan tersebut. Ayo keluar pada anggota badan dan menyebutnya minimumBalance. Tapi sekarang Anda punya masalah. Karena Tabungan
mewarisi dari Memeriksa, Tabungan mendapatkan data anggota baru ini juga. Tidak ada gunanya bagi anggota ini karena saldo minimum tidak mempengaruhi rekening tabungan, jadi hanya duduk di sana. Ingatlah bahwa setiap objek rekening giro memiliki anggota minimumBalance tambahan ini. Salah satu anggota data tambahan mungkin bukan masalah besar, tapi ini menambah kebingungan lebih lanjut. Perubahan seperti ini menumpuk. Hari ini adalah anggota data ekstra - besok ini adalah fungsi anggota yang berubah. Akhirnya, kelas rekening tabungan membawa banyak bagasi ekstra yang hanya berlaku untuk rekening giro. Sekarang bank kembali dan memutuskan untuk mengubah beberapa kebijakan rekening tabungan. Ini mengharuskan Anda memodifikasi beberapa fungsi di
Checking.
Perubahan seperti ini di kelas dasar secara otomatis menyebar ke subkelas kecuali jika fungsinya sudah diganti di subclass Tabungan. Misalnya, anggaplah bank memutuskan untuk memberikan toaster untuk setiap deposit ke rekening giro. Tanpa bank (atau pemrogramnya) mengetahuinya, simpanan ke rekening giro akan menghasilkan sumbangan pemanggang roti secara otomatis. Kecuali Anda sangat berhati-hati, perubahan pada Memeriksa
mungkin tiba-tiba muncul di Tabungan . Bagaimana Anda bisa menghindari masalah ini? Mengklaim bahwa Memeriksa
adalah kasus khusus dari Tabungan namun tidak menyelesaikan masalah kami. Yang Anda butuhkan adalah kelas ketiga (sebut saja Akun, hanya untuk nyengir) yang mewujudkan hal-hal yang umum di antara Memeriksa dan Tabungan seperti yang ditunjukkan di sini. Memeriksa dan
Tabungan pada kelas Account yang sama. "> Basing Memeriksa dan Tabungan pada kelas Account yang sama. Bagaimana membangun akun baru untuk memecahkan masalah? Pertama, menciptakan kelas Accountyang baru adalah deskripsi dunia nyata yang lebih akurat (apapun itu). Tentu saja, sebenarnya ada sesuatu yang dikenal sebagai akun. Rekening tabungan dan rekening giro adalah kasus khusus dari konsep yang lebih mendasar ini. Selain itu, kelas Tabungan
terisolasi dari perubahan ke kelas Memeriksa (dan sebaliknya). Jika bank menetapkan perubahan mendasar pada semua akun, Anda dapat memodifikasi Account, dan semua subclass akan secara otomatis mewarisi perubahan tersebut. Tetapi jika bank mengubah kebijakannya hanya untuk memeriksa rekening, Anda dapat memodifikasi hanya sekedar kelas Memeriksa tanpa mempengaruhi Tabungan . Proses pemusnahan properti umum dari kelas yang sama adalah esensi anjak kelas .
Anjak sah hanya jika hubungan pewarisan sesuai dengan kenyataan. Anjak bersama-sama dengan sebuah kelas Mouse
dan Joystick karena keduanya adalah perangkat penunjuk perangkat yang sah. Anjak bersama-sama kelas Mouse dan Tampilan karena keduanya sama-sama membuat panggilan sistem operasi tingkat rendah tidak.