Ini bukan masalah mana yang terbaik, tetapi kapan harus menggunakan apa.
Dalam kasus-kasus 'normal', pertanyaan sederhana sudah cukup untuk mengetahui apakah kita membutuhkan warisan atau agregasi.
- Jika Kelas baru adalah kurang lebih sebagai kelas yang asli. Gunakan warisan. Kelas baru sekarang menjadi subclass dari kelas asli.
- Jika kelas baru harus memiliki kelas asli. Gunakan agregasi. Kelas baru sekarang memiliki kelas asli sebagai anggota.
Namun, ada area abu-abu besar. Jadi kita perlu beberapa trik lain.
- Jika kami telah menggunakan warisan (atau kami berencana untuk menggunakannya) tetapi kami hanya menggunakan bagian dari antarmuka, atau kami terpaksa menimpa banyak fungsi untuk menjaga korelasi logis. Lalu kami memiliki bau tidak enak yang menandakan bahwa kami harus menggunakan agregasi.
- Jika kami telah menggunakan agregasi (atau kami berencana untuk menggunakannya) tetapi kami tahu kami perlu menyalin hampir semua fungsionalitas. Lalu kita memiliki bau yang menunjuk ke arah warisan.
Untuk memotongnya. Kita harus menggunakan agregasi jika bagian dari antarmuka tidak digunakan atau harus diubah untuk menghindari situasi yang tidak masuk akal. Kita hanya perlu menggunakan warisan, jika kita membutuhkan hampir semua fungsi tanpa perubahan besar. Dan jika ragu, gunakan Agregasi.
Kemungkinan lain untuk, kasus bahwa kita memiliki kelas yang membutuhkan bagian dari fungsionalitas kelas asli, adalah untuk membagi kelas asli menjadi kelas root dan sub kelas. Dan biarkan kelas baru mewarisi dari kelas root. Tetapi Anda harus berhati-hati dengan ini, bukan untuk menciptakan pemisahan yang tidak logis.
Mari kita tambahkan contoh. Kami memiliki kelas 'Dog' dengan metode: 'Eat', 'Walk', 'Bark', 'Play'.
class Dog
Eat;
Walk;
Bark;
Play;
end;
Kita sekarang membutuhkan kelas 'Kucing', yang membutuhkan 'Makan', 'Jalan', 'Purr', dan 'Mainkan'. Jadi pertama-tama cobalah untuk memperpanjang dari Anjing.
class Cat is Dog
Purr;
end;
Terlihat, baiklah, tapi tunggu. Kucing ini bisa menggonggong (Pecinta Kucing akan membunuhku untuk itu). Dan seekor kucing menggonggong melanggar prinsip-prinsip alam semesta. Jadi kita perlu mengganti metode Bark agar tidak melakukan apa-apa.
class Cat is Dog
Purr;
Bark = null;
end;
Ok, ini berhasil, tapi baunya buruk. Jadi mari kita coba agregasi:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
Ok, ini bagus. Kucing ini tidak menggonggong lagi, bahkan tidak diam. Tetapi masih memiliki anjing internal yang ingin keluar. Jadi mari kita coba solusi nomor tiga:
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
Ini jauh lebih bersih. Tidak ada anjing internal. Dan kucing dan anjing berada pada level yang sama. Kami bahkan dapat memperkenalkan hewan peliharaan lain untuk memperluas model. Kecuali kalau itu ikan, atau sesuatu yang tidak bisa berjalan. Dalam hal ini kita perlu refactor lagi. Tetapi itu adalah sesuatu untuk waktu yang lain.