我正在阅读Head First Design Patterns并对Java有一些了解。它首先封装了与您的类不同的东西,并将它们放在一个单独的接口中,而不是将这些功能放在子类中。他们给出的一个例子是一个抽象的鸭子类,可以根据鸭子嘎嘎叫或飞行。它们有一个quack和fly接口(QuackBehavior和FlyBehavior接口),然后在其他类中实现这些接口。
在这个例子中,他们有抽象的鸭子类,如下所示
public abstract class Duck {
QuackBehavior quackBehavior;
FlyBehavior flyBehavior;
.....
}
我想对我来说最新的是拥有一个接口类型的实例变量。我之前从未学过这些,但我认为它是有效的?我想我更熟悉一个具体类的实例变量。是否有关于这样的类/接口的实例变量的规则?感谢。
答案 0 :(得分:2)
这是有效的,也是一种常见做法。
实例变量是什么并不重要。甚至优选在可能的情况下使用接口。例如,始终定义List
类型而非ArrayList
否则你怎么能有不同的行为?现在,您可以将LowFlyBehaviour
和HighFlyBehaviour
分配给字段,因此Duck
的不同实例可以具有不同的飞行行为。如果该字段是这些具体类型中的任何一种,那么这是不可能的。
答案 1 :(得分:0)
如果您将字段声明为接口类型,则该字段将能够保存任何实现该接口的类。
这是一个正常的领域。
答案 2 :(得分:0)
是的,这是有效的。申请的唯一规则与申请任何其他类型相同;即你只能分配实现声明的接口的东西。您可能已经看过甚至使用过类似的语法而没有意识到它,例如:
List<String> list = new ArrayList<String>();
Serializable s = new Object();