隐藏子类中超类的字段

时间:2013-07-18 16:42:47

标签: java field mask superclass

我们说我有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。

2 个答案:

答案 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}}类型为varList<String>的{​​{1}}类型为Bvar }是一个单独的类。正如您所知,两者都使用列表但使用不同的模板类型,并且两者仍然执行相同的操作(浏览列表并对元素执行某些操作)

听起来你的课程应该是通用的,例如:

List<Item>

不要过于字面意思地使用此代码 - 只是建议可能的设计。

答案 1 :(得分:0)

我的首选项是为了避免对子类中超类中的字段进行直接字段访问,因为它减少了对超类实现的依赖性。 (肯定有一段时间我会创建字段protected,因为我确实希望从子类中明确地使用它们,但这不是常态)。

我更喜欢做的是在getter / setter方法中封装字段访问,并故意使它们受到保护或公开,因此子类可以显式地覆盖它们。一般来说,我经常发现直接字段访问会禁止重构或稍后修改实现,方法是使更多的类更新,而不是必要的。

在您的情况下,如果您正在处理其他人编写的代码,并且无法访问基类的源代码,那么这是有道理的。但是否则我不会这样做,因为对于其他开发者来说,你有意隐藏这个领域可能并不那么明显。如果这仅供您自己使用(而不是其他开发人员),那么实际上,我认为这并不重要。