Atas permintaan exizt, saya memperluas komentar saya ke jawaban yang lebih panjang.
Kesalahan terbesar yang dilakukan orang adalah percaya bahwa antarmuka hanyalah kelas abstrak yang kosong. Antarmuka adalah cara bagi seorang programmer untuk mengatakan, "Saya tidak peduli apa yang Anda berikan kepada saya, asalkan mengikuti konvensi ini."
Pustaka .NET berfungsi sebagai contoh yang bagus. Misalnya, ketika Anda menulis fungsi yang menerima IEnumerable<T>
, apa yang Anda katakan adalah, "Saya tidak peduli bagaimana Anda menyimpan data Anda. Saya hanya ingin tahu bahwa saya bisa menggunakan foreach
loop.
Ini mengarah pada beberapa kode yang sangat fleksibel. Tiba-tiba untuk diintegrasikan, yang perlu Anda lakukan hanyalah bermain sesuai aturan antarmuka yang ada. Jika mengimplementasikan antarmuka sulit atau membingungkan, maka mungkin itu adalah petunjuk bahwa Anda mencoba untuk mendorong pasak persegi di lubang bundar.
Tetapi kemudian muncul pertanyaan: "Bagaimana dengan penggunaan kembali kode? Profesor CS saya mengatakan kepada saya bahwa warisan adalah solusi untuk semua masalah penggunaan kembali kode dan bahwa warisan memungkinkan Anda untuk menulis sekali dan menggunakan di mana-mana dan itu akan menyembuhkan menangitis dalam proses menyelamatkan anak yatim piatu. dari laut yang naik dan tidak akan ada lagi air mata dan seterusnya dll dll. "
Menggunakan pewarisan hanya karena Anda menyukai bunyi kata "penggunaan kembali kode" adalah ide yang sangat buruk. The panduan kode styling oleh Google membuat titik ini cukup ringkas:
Komposisi seringkali lebih tepat daripada warisan. ... [B] karena kode yang mengimplementasikan sub-kelas tersebar antara basis dan sub-kelas, mungkin akan lebih sulit untuk memahami suatu implementasi. Subkelas tidak dapat mengesampingkan fungsi yang bukan virtual, sehingga subkelas tidak dapat mengubah implementasi.
Untuk mengilustrasikan mengapa pewarisan tidak selalu jawabannya, saya akan menggunakan kelas yang disebut MySpecialFileWriter †. Seseorang yang secara buta percaya bahwa pewarisan adalah solusi untuk semua masalah akan berargumen bahwa Anda harus mencoba mewarisi FileStream
, jangan sampai Anda menduplikasi FileStream
kode. Orang pintar menyadari bahwa ini bodoh. Anda seharusnya hanya memiliki FileStream
objek di kelas Anda (baik sebagai variabel lokal atau anggota) dan menggunakan fungsinya.
The FileStream
contoh mungkin tampak dibikin, tapi tidak. Jika Anda memiliki dua kelas yang keduanya mengimplementasikan antarmuka yang sama dengan cara yang sama persis, maka Anda harus memiliki kelas ketiga yang merangkum operasi apa pun yang diduplikasi. Sasaran Anda adalah menulis kelas-kelas yang berisi blok-blok yang dapat digunakan sendiri dan dapat disatukan seperti lego.
Ini tidak berarti bahwa warisan harus dihindari dengan cara apa pun. Ada banyak hal yang perlu dipertimbangkan, dan sebagian besar akan dibahas dengan meneliti pertanyaan, "Komposisi vs Warisan." Stack Overflow kami sendiri memiliki beberapa jawaban bagus tentang masalah ini.
Pada akhirnya, sentimen rekan kerja Anda tidak memiliki kedalaman atau pemahaman yang diperlukan untuk membuat keputusan. Teliti subjeknya dan cari tahu sendiri.
† Saat menggambarkan warisan, semua orang menggunakan hewan. Itu tidak berguna. Dalam 11 tahun pengembangan, saya tidak pernah menulis sebuah kelas bernama Cat
, jadi saya tidak akan menggunakannya sebagai contoh.
alligator
Implementasi darieat
perbedaan, tentu saja, dalam hal ia menerimacat
dandog
sebagai parameter.