是否有必要在实现中使用接口类型,还是只将它们用作类或接口的公共接口的一部分?
示例(Java):
public class SomeClass {
// Declare list as..
private List<Object> list = new ArrayList<Object>();
// or...
private ArrayList<Object> list = new ArrayList<Object>();
// Does it matter which way list is declared if it's part
// of the private implementation?
// This parameter should be the most general interface type
// allowed because it's public-facing.
public void someMethod(List<Object> list) {
// ...
}
}
答案 0 :(得分:3)
通过将它们定义为尽可能抽象,您隐藏了实现细节。如果您希望使用List<T>
中的其他子类而不是ArrayList<T>
,那么您可以在不破坏任何代码的情况下这样做。
尽管仍然拥有您需要的方法,但始终尽可能抽象。这样你的实现就会尽可能灵活。
例如,我是一个有宠物的人。现在我有一只猫,但是如果我去非洲度假并碰巧看到一只非常棒的大象呢?我的猫会饿死,因为没有人给她食物,我会把大象放回口袋里回比利时。如果我将它定义为猫,我将不得不改变我的整个班级。相反,我将其定义为动物。
public class Person {
String name;
Animal pet;
// Getters & Setters + Constructor
}
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Cat extends Animal {
public Cat() { super("Cat")); }
}
public class Elephant extends Animal {
public Elephant() { super("Elephant")); }
}
public class Lion extends Animal {
public Lion() { super("Lion")); }
}
所以当我创建一个新人时:
Person bestPersonInTheWorld = new Person();
bestPersonInTheWorld.setName("Jeroen");
bestPersonInTheWorld.setPet(new Cat());
我可以简单地杀死猫
bestPersonInTheWorld.dontFeedForTwoWeeks();
我把我的大象放在院子里:
bestPersonInTheWorld.setPet(new Elephant());
在实施方面没有必要改变。