Nauczono mnie również tego i wolę interfejsy tam, gdzie to możliwe (oczywiście nadal używam dziedziczenia tam, gdzie ma to sens).
Myślę, że jedną rzeczą jest oddzielenie kodu od konkretnych implementacji. Powiedzmy, że mam klasę o nazwie ConsoleWriter, która zostaje przekazana do metody napisania czegoś i zapisuje to na konsoli. Powiedzmy teraz, że chcę przejść do drukowania do okna GUI. Cóż, teraz muszę zmodyfikować metodę lub napisać nową, która przyjmuje GUIWriter jako parametr. Jeśli zacznę od zdefiniowania interfejsu IWriter i jeśli metoda przyjmie IWriter, mógłbym zacząć od ConsoleWriter (który implementuje interfejs IWriter), a następnie napisać nową klasę o nazwie GUIWriter (która również implementuje interfejs IWriter), a następnie I musiałby po prostu wyłączyć zaliczaną klasę.
Inną rzeczą (co jest prawdą w języku C #, co do Javy nie jest pewne) jest to, że można rozszerzyć tylko 1 klasę, ale zaimplementować wiele interfejsów. Powiedzmy, że miałem zajęcia o nazwie Teacher, MathTeacher i HistoryTeacher. Teraz MathTeacher i HistoryTeacher wychodzą od Nauczyciela, ale co, jeśli chcemy, aby klasa reprezentowała kogoś, kto jest zarówno Nauczycielem matematyki, jak i Nauczycielem historii. Może stać się dość niechlujny, gdy próbujesz odziedziczyć po wielu klasach, gdy możesz to zrobić tylko pojedynczo (istnieją sposoby, ale nie są one dokładnie optymalne). Dzięki interfejsom możesz mieć 2 interfejsy o nazwie IMathTeacher i IHistoryTeacher, a następnie mieć jedną klasę wychodzącą od Nauczyciela i implementującą te 2 interfejsy.
Jedną wadą korzystania z interfejsów jest to, że czasami widzę, jak ludzie duplikują kod (ponieważ musisz utworzyć implementację dla każdej klasy, implementować interfejs), jednak istnieje czyste rozwiązanie tego problemu, na przykład użycie rzeczy takich jak delegaci (nie jestem pewien czym jest odpowiednik Java).
Myślą, że największym powodem używania interfejsów do dziedziczenia jest oddzielenie kodu implementacyjnego, ale nie sądzę, że dziedziczenie jest złe, ponieważ wciąż jest bardzo przydatne.