Несмотря на то, что мне понравился пример со стратегией из ответов, я тоже отвечу, потому что я думаю, что вы немного запутались в принципе инверсии зависимостей.
Принцип инверсии зависимостей означает
Дон 'Используйте это, если вам действительно не нужно поведение LinkedList:
public class A {
private LinkedList<SomeClass> list;
//...
}
Используйте это вместо этого:
public class A {
private List<SomeClass> list; //or even use Collection or Iterable
//...
}
Зависимости - это то, что мы используем внутри нашего класса.
Наследование
Наследование - это то, что мы называем отношениями IS-A, и оно не имеет ничего общего с принципом.Если вы хотите создать класс A, который наследует класс B, вам нужно ответить на вопрос: верно ли, что A является B. Если вы зададите этот вопрос, вы обнаружите, что выражение "FlyingBird
является NonFlyingBird
"бессмысленность.
Повторное использование кода с наследованием
Подумайте об этом: не все птицы могут летать и не только птицы (например, мухи) могут летать.Это может привести нас к мысли, что мы должны создать интерфейс Flyable, как вы уже сделали.Затем мы должны переименовать NonFlyingBird
в SimpleBird
, потому что если какое-то существо является птицей, это не значит, что оно может летать.В конце вы получите:
class FlyingBird extends SimpleBird implements Flyable {
void fly() {
...
}
...
}
Надеюсь, это поможет.