如果我正在扩展一个具有自己的受保护成员变量和方法的类,那么在子类(或进行扩展的类,无论哪个是正确的)中,如何正确引用这些内容?
例如,如果我在扩展类中有protected int mInt
,我是否在子类中创建另一个int mInt
并初始化它?或者我是否总是直接引用父类的字段和方法?
我问,因为我需要确保某些对象具有某些字段,所以我需要它们来扩展相同的父类,但我不知道这对于如何构造子类中的方法意味着什么。我是一直只使用super
还是制作所有父内容的“本地”副本是个好主意?
答案 0 :(得分:1)
受保护的方法是类的API的一部分,它们的用法类似于公共方法,但它们的可见性仅限于子类,这有时很有用。
另一方面,受保护的字段几乎不是一个好主意,因为它们使类无法维护其不变量。举个例子:
class Divider {
protected int divisor;
public void setDivisor(int divisor) {
//we need to check the input to make sure our Divider works correctly
if (divisor == 0)
throw new IllegalArgumentException("divisor can't be zero");
this.divisor = divisor;
}
public int divide(int number) {
return number/divisor;
}
}
到目前为止,非常好,但另外一个类是:
class BadDivider extends Divider {
public void doABadThing() {
this.divisor = 0;
}
}
现在我们情况很糟糕:维持班级不变量(即divisor != 0
)的所有努力都被BadDivider
破坏了。由于任何人都可以延长Divider
,因此无法阻止这种情况发生。这也告诉我们何时可以使用受保护的字段:当您可以保证控制所有可以继承它们的类时。这很少发生。
所以解决方案是保持每个字段都是私有的,并确保检查方法(和构造函数)的输入。这允许您推断对象的内部状态,并保证它们始终处于有效状态。
答案 1 :(得分:0)
我总是使用私有属性;除非真的需要,否则没有二传手;如果需要公开类成员,请使用接口。 话虽这么说,你会继承班级成员。如果不能从子进程访问,你可以引用super,你不需要在子类中创建另一个mInt int;如果需要在子类中设置值,则在父级中有一个受保护的setter,并在子类/类中使用。我建议阅读设计模式和4个核心OO原则。希望有所帮助。