如何在继承中实现封装

时间:2014-05-26 05:04:12

标签: java encapsulation

我有两个班级TestEncap。我有一个私有变量a并通过setter和getter方法访问。我正在使用Test继承课程Encap

现在,我可以使用a更改setValue(int a)的值。我想限制这个选项。我希望它将它作为只读值。请帮助我。

class Test
{
    private int a;
    protected void setValue(int a)
    {
        this.a = a;
    }
    protected void getValue()
    {
        System.out.println("The assigned value of a is : "+this.a);
    }
}
public class Encap extends Test {
    public static void main(String [] args)
    {
        Test t = new Test();
        t.setValue(4);
        t.getValue();
        Encap e = new Encap();
        e.setValue(3);
        e.getValue();      
    }
}

2 个答案:

答案 0 :(得分:3)

一种选择是从课程setValue()删除方法Test

class Test
{
    private int a;

    protected void getValue()
    {
        System.out.println("The assigned value of a is : "+this.a);
    }
}

修改 为什么要这样做?如果Encap继承自Test,则应该能够执行与Test相同的操作。否则,继承的目的是什么?如果您仍然认为Test应该能够修改值而Encap没有,那么您的设计可能是错误的。你可以尝试这样的事情:

              BaseClass
              ---------
              +getValue
                /   \
               /     \
           Test       Encap
         --------   ---------
        +setValue   

答案 1 :(得分:1)

如果你的意思是希望派生类不公开超类的公共方法,那么你的代码可能会“闻起来”......

请记住,继承模型“是A”

因此,在您的示例中,Encap 测试,您应该能够对可以对测试执行的Encap执行任何操作。

但是,如果您只是必须从不希望公开父类方法的类继承,则可以覆盖该方法并使其主体不执行任何操作。但是对于简单的getter和setter访问器方法,这对于代码的客户来说可能非常混乱。

如果你无法调和事情并且在Encap上调用setValue()永远不是正确的事情,我建议覆盖该方法,自由地评论它并让它什么都不做,或抛出一个异常来指示客户说他们正在做一些没有意义的事情。