Saya telah diajarkan ini juga dan saya lebih suka antarmuka jika memungkinkan (tentu saja saya masih menggunakan warisan mana yang masuk akal).
Satu hal yang saya pikirkan adalah memisahkan kode Anda dari implementasi spesifik. Katakanlah saya memiliki kelas yang disebut ConsoleWriter dan itu akan diteruskan ke metode untuk menulis sesuatu dan menulisnya ke konsol. Sekarang katakanlah saya ingin beralih ke pencetakan ke jendela GUI. Nah sekarang saya harus memodifikasi metode atau menulis yang baru yang menggunakan GUIWriter sebagai parameter. Jika saya mulai dengan mendefinisikan antarmuka IWriter dan memiliki metode mengambil IWriter saya bisa mulai dengan ConsoleWriter (yang akan mengimplementasikan antarmuka IWriter) dan kemudian menulis kelas baru yang disebut GUIWriter (yang juga mengimplementasikan antarmuka IWriter) dan kemudian saya hanya perlu mengganti kelas yang sedang lewat.
Hal lain (yang berlaku untuk C #, tidak yakin tentang Java) adalah Anda hanya dapat memperluas 1 kelas tetapi mengimplementasikan banyak antarmuka. Katakanlah saya punya kelas bernama Teacher, MathTeacher, dan HistoryTeacher. Sekarang MathTeacher dan HistoryTeacher meluas dari Guru tetapi bagaimana jika kita menginginkan kelas yang mewakili seseorang yang merupakan seorang MathTeacher dan HistoryTeacher. Ini bisa menjadi sangat berantakan ketika mencoba mewarisi dari beberapa kelas ketika Anda hanya bisa melakukannya satu per satu (ada cara tetapi mereka tidak sepenuhnya optimal). Dengan antarmuka, Anda dapat memiliki 2 antarmuka yang disebut IMathTeacher dan IHistoryTeacher dan kemudian memiliki satu kelas yang meluas dari Guru dan mengimplementasikan 2 antarmuka tersebut.
Satu kelemahan yang dengan menggunakan antarmuka adalah bahwa kadang-kadang saya melihat orang menggandakan kode (karena Anda harus membuat implementasi untuk setiap kelas mengimplementasikan antarmuka) namun ada solusi bersih untuk masalah ini, misalnya penggunaan hal-hal seperti delegasi (tidak yakin apa yang setara dengan Java itu).
Pemikiran alasan terbesar untuk menggunakan antarmuka atas warisan adalah decoupling dari kode implementasi tetapi tidak berpikir bahwa warisan itu jahat karena masih sangat berguna.