Warisan kelas dan antarmuka keduanya memiliki tempat masing-masing. Warisan berarti "adalah" sementara antarmuka memberikan kontrak yang mendefinisikan seperti apa sesuatu "berperilaku".
Saya akan mengatakan bahwa menggunakan antarmuka lebih sering bukanlah praktik yang buruk sama sekali. Saya sedang membaca "Efektif C # - 50 Cara Tertentu untuk Meningkatkan C #" Anda oleh Bill Wagner. Item nomor 22 menyatakan, dan kutipan saya, "Memilih Menentukan dan Menerapkan Antarmuka ke Warisan".
Secara umum saya menggunakan kelas dasar ketika saya perlu mendefinisikan implementasi spesifik dari perilaku umum antara tipe yang berhubungan secara konseptual. Lebih sering saya menggunakan antarmuka. Bahkan, saya biasanya memulai dengan mendefinisikan antarmuka untuk kelas ketika saya mulai membuat satu ... bahkan jika pada akhirnya saya tidak mengkompilasi antarmuka, saya menemukan bahwa itu membantu untuk memulai dengan mendefinisikan API publik dari kelas dari mulai. Jika saya menemukan bahwa saya memiliki beberapa kelas yang mengimplementasikan antarmuka, dan logika implementasi identik, hanya kemudian saya akan bertanya pada diri sendiri apakah masuk akal untuk mengimplementasikan kelas dasar yang umum di antara kedua tipe tersebut.
Beberapa kutipan dari buku Bill Wagners ...
semua kelas turunan segera menggabungkan perilaku itu. Menambahkan anggota ke antarmuka memecah semua kelas yang mengimplementasikan antarmuka itu. Mereka tidak akan berisi metode baru dan tidak akan lagi dikompilasi. Setiap pelaksana harus memperbarui jenis itu untuk memasukkan anggota baru. Memilih antara kelas dasar abstrak dan antarmuka adalah pertanyaan tentang cara terbaik untuk mendukung abstraksi Anda dari waktu ke waktu. Antarmuka diperbaiki: Anda merilis antarmuka sebagai kontrak untuk serangkaian fungsi yang dapat diterapkan oleh semua jenis. Kelas dasar dapat diperpanjang dari waktu ke waktu. Ekstensi itu menjadi bagian dari setiap kelas turunan. Kedua model dapat dicampur untuk menggunakan kembali kode implementasi sambil mendukung beberapa antarmuka. " Mereka tidak akan berisi metode baru dan tidak akan lagi dikompilasi. Setiap pelaksana harus memperbarui jenis itu untuk memasukkan anggota baru. Memilih antara kelas dasar abstrak dan antarmuka adalah pertanyaan tentang cara terbaik untuk mendukung abstraksi Anda dari waktu ke waktu. Antarmuka diperbaiki: Anda merilis antarmuka sebagai kontrak untuk serangkaian fungsi yang dapat diterapkan oleh semua jenis. Kelas dasar dapat diperpanjang dari waktu ke waktu. Ekstensi itu menjadi bagian dari setiap kelas turunan. Kedua model dapat dicampur untuk menggunakan kembali kode implementasi sambil mendukung beberapa antarmuka. " Mereka tidak akan berisi metode baru dan tidak akan lagi dikompilasi. Setiap pelaksana harus memperbarui jenis itu untuk memasukkan anggota baru. Memilih antara kelas dasar abstrak dan antarmuka adalah pertanyaan tentang cara terbaik untuk mendukung abstraksi Anda dari waktu ke waktu. Antarmuka diperbaiki: Anda merilis antarmuka sebagai kontrak untuk serangkaian fungsi yang dapat diterapkan oleh semua jenis. Kelas dasar dapat diperpanjang dari waktu ke waktu. Ekstensi itu menjadi bagian dari setiap kelas turunan. Kedua model dapat dicampur untuk menggunakan kembali kode implementasi sambil mendukung beberapa antarmuka. " Anda merilis antarmuka sebagai kontrak untuk serangkaian fungsi yang dapat diterapkan oleh semua jenis. Kelas dasar dapat diperpanjang dari waktu ke waktu. Ekstensi itu menjadi bagian dari setiap kelas turunan. Kedua model dapat dicampur untuk menggunakan kembali kode implementasi sambil mendukung beberapa antarmuka. " Anda merilis antarmuka sebagai kontrak untuk serangkaian fungsi yang dapat diterapkan oleh semua jenis. Kelas dasar dapat diperpanjang dari waktu ke waktu. Ekstensi itu menjadi bagian dari setiap kelas turunan. Kedua model dapat dicampur untuk menggunakan kembali kode implementasi sambil mendukung beberapa antarmuka. "
"Antarmuka pengkodean memberikan fleksibilitas yang lebih besar untuk pengembang lain daripada pengkodean ke tipe kelas dasar."
"Menggunakan antarmuka untuk mendefinisikan API untuk suatu kelas memberikan fleksibilitas yang lebih besar."
"Ketika tipe Anda mengekspos properti sebagai tipe kelas, itu mengekspos seluruh antarmuka ke kelas itu. Menggunakan antarmuka, Anda dapat memilih untuk mengekspos hanya metode dan properti yang Anda ingin klien gunakan."
"Kelas dasar menggambarkan dan menerapkan perilaku umum di seluruh jenis beton terkait. Antarmuka menggambarkan potongan-potongan fungsionalitas atom yang dapat diterapkan oleh jenis beton yang tidak terkait. Keduanya memiliki tempat masing-masing. Kelas menentukan jenis yang Anda buat. Antarmuka menggambarkan perilaku jenis-jenis itu sebagai bagian dari fungsionalitas. Jika Anda memahami perbedaannya, Anda akan membuat desain yang lebih ekspresif yang lebih tangguh dalam menghadapi perubahan. Gunakan hierarki kelas untuk mendefinisikan tipe terkait. Paparkan fungsionalitas menggunakan antarmuka yang diimplementasikan pada semua tipe itu. "