Mógłbyś stworzyć interfejsy dla klas zwierząt (klasa w znaczeniu biologicznym), na przykład public interface Equidae
dla koni i public interface Avialae
ptaków (nie jestem biologiem, więc terminy mogą być błędne).
Wtedy nadal możesz utworzyć plik
public class Bird implements Avialae {
}
i
public class Horse implements Equidae {}
i również
public class Pegasus implements Avialae, Equidae {}
Dodawanie z komentarzy:
Aby zmniejszyć liczbę duplikatów kodu, możesz utworzyć klasę abstrakcyjną zawierającą większość wspólnego kodu zwierząt, które chcesz zaimplementować.
public abstract class AbstractHorse implements Equidae {}
public class Horse extends AbstractHorse {}
public class Pegasus extends AbstractHorse implements Avialae {}
Aktualizacja
Chciałbym dodać jeszcze jeden szczegół. Jak zauważa Brian , jest to coś, o czym OP już wiedział.
Pragnę jednak podkreślić, że proponuję ominąć problem „wielokrotnego dziedziczenia” z interfejsami i nie polecam używania interfejsów, które reprezentują już konkretny typ (np. Bird), a raczej zachowanie (inne odnoszą się do typowanie kaczek, co też jest dobre, ale mam na myśli tylko biologiczną klasę ptaków, Avialae). Nie polecam również używania nazw interfejsów zaczynających się od dużej litery „I”, takich jakIBird
, co nie mówi nic o tym, dlaczego potrzebny jest interfejs. Na tym polega różnica w pytaniu: skonstruuj hierarchię dziedziczenia za pomocą interfejsów, użyj klas abstrakcyjnych, gdy jest to przydatne, zaimplementuj konkretne klasy w razie potrzeby i użyj delegowania, jeśli to konieczne.