假设我们有一个Automobile对象:
public interface Automobile {
}
我们还有一些不同的汽车(is-a),一辆带有自动变速器,另一辆带有手动变速器:
public class FordExplorer implements Autmomobile {
public static void shiftIntoPark() {
}
}
public class Porsche911 implements Autmomobile {
public static void shiftInto1stGear() {
}
}
现在,假设我们有一个枚举车库,用于存储这些汽车:
public enum Garage {
FORD {
public Automobile getCar() {
return new FordExplorer();
}
}, PORSCHE {
public Automobile getCar() {
return new Porsche911();
}
};
abstract public Automobile getCar();
}
}
对于这种类型安全的实现(或类似的实现)是否存在“最佳实践”(即,FORD的getCar()方法的返回类型仅包含shiftIntoPark()方法,并且同样,PORSCHE的相同方法的返回类型只包括shiftInto1stGear()方法)?
答案 0 :(得分:2)
Garage.getCar返回的类型是Automobile,它不会暴露任何这些park方法。由于shift方法是静态的,你不会从中获得多态行为,因此必须在特定的类上调用它们。
很可能你期望使用汽车的东西太聪明了它如何使用汽车,从而破坏了使用界面的目的。使用这样的接口或超类使得程序可以在不关心实现细节的情况下高级操作对象,让不同的对象实现自己处理。类似的玩具示例可能是暴露公园方法的汽车,其中公园方法由特定子类根据其特定需要以不同方式实现。
(或者完全摆脱界面,因为驾驶野马并不像驾驶卡罗拉那样,他们共享界面可能没有意义。)
接口和超类有助于提供高级接口并隐藏实现细节,以便它们可以包含在本地,并且不会泄漏到程序的其余部分。弄清楚你希望如何使用对象,它定义了你想要公开的接口,以及你希望对象自己处理什么。