【发布时间】:2019-09-28 01:43:07
【问题描述】:
依赖倒置原则说(Head First Java):
- 依赖于抽象。不要依赖具体的类。
继承是什么意思?因为子类依赖于具体类。
我问的是一个案例——有一个接口Bird(没有飞方法,因为有些鸟不能飞),它代表所有非会飞的鸟。所以我创建了一个类——NonFlyingBird,它实现了Bird。
现在我想为会飞的鸟创建一个课程。由于NonFlyingBirds 和FlyingBirds 具有相同的属性,我从NonFlyingBirds 扩展FlyingBirds 并实现Flyable 以使其具有飞行行为。
由于FlyingBirds 是从一个具体类NonFlyingBirds 扩展而来,它不会破坏依赖倒置原则吗?
interface Bird { // Represents non Flying birds
void getColor();
void getHeight();
...
}
class NonFlyingBird implements Bird {
void getColor();
void getHeight();
...
}
class FlyingBird extends NonFlyingBird implements Flyable { // Does it break Dependency Inversion principle by extending concrete NonFlyingBird class?
Flyable fly;
...
}
注意 - 我扩展的唯一原因是因为 FlyingBird 具有与 NonFlyingBird 相同的属性和方法 + 飞行行为。所以通过继承重用代码是有意义的。
【问题讨论】:
-
现在每一个
FlyingBird也是一个NonFlyingBird,而你违反了Liskov's substitution principle -
@JohannesKuhn 但我想不出为什么用
NonFlyingBird替换FlyingBird会导致任何问题? -
也许不是现在,但下个月会有下一个实习生说“我知道,我只是使用
instanceof检查它是非飞鸟还是飞鸟”,然后会诅咒你的决定。 -
@JohannesKuhn 嗯,好点。在我看来,我需要为移动和非移动的鸟类创建两个不同的类。对吗?
-
您在下面有一些很好的答案,但问题是错误的。当你对继承做了一些糟糕的事情时,继承不是问题。问题是你用它做了什么。不要那样做。
标签: java oop design-patterns dependency-inversion