我们说我有3个班级:
class Foo
{
protected String var;
public void doSomething()
{
// does something with var
}
}
class A extends Foo
{
public void doSomething()
{
// uses var slightly differently to Foo
}
}
class B extends Foo
{
protected int var; // hides Foo's var field
public void doSomething()
{
// does something with B's var, but still in a similar fashion to Foo
}
}
在这种情况下,我知道并希望B的var字段隐藏Foo并仍然以类似的方式使用(打印其值或执行某些计算或其他)。
故意隐藏字段会使代码难以阅读,但这是一个例外吗,还是只是设计不好?
修改
我确实希望A继承' var'来自Foo但我也喜欢B继承除var。
编辑2:
忘了将访问修饰符添加到var。
答案 0 :(得分:5)
您无法“覆盖”字段,方法与覆盖方法的方式相同。您需要使用方法重写来实现此行为。例如:
class Foo
{
private String var;
Object getVar() {
return var;
}
}
class B extends Foo
{
private int var;
@Override
Object getVar() {
return var;
}
}
修改:根据您的评论:
Foo
的{{1}}类型为var
,List<String>
的{{1}}类型为B
,var
}是一个单独的类。正如您所知,两者都使用列表但使用不同的模板类型,并且两者仍然执行相同的操作(浏览列表并对元素执行某些操作)
听起来你的课程应该是通用的,例如:
List<Item>
不要过于字面意思地使用此代码 - 只是建议可能的设计。
答案 1 :(得分:0)
我的首选项是为了避免对子类中超类中的字段进行直接字段访问,因为它减少了对超类实现的依赖性。 (肯定有一段时间我会创建字段protected
,因为我确实希望从子类中明确地使用它们,但这不是常态)。
我更喜欢做的是在getter / setter方法中封装字段访问,并故意使它们受到保护或公开,因此子类可以显式地覆盖它们。一般来说,我经常发现直接字段访问会禁止重构或稍后修改实现,方法是使更多的类更新,而不是必要的。
在您的情况下,如果您正在处理其他人编写的代码,并且无法访问基类的源代码,那么这是有道理的。但是否则我不会这样做,因为对于其他开发者来说,你有意隐藏这个领域可能并不那么明显。如果这仅供您自己使用(而不是其他开发人员),那么实际上,我认为这并不重要。