如何在继承中实现封装



我有两个类TestEncap。我有一个私有变量a和访问通过setter和getter方法。我用Encap继承了Test类。

现在我可以用setValue(int a)来改变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();      
    }
}

一种选择是从类Test中删除方法setValue():

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   

如果您的意思是希望派生类不公开超类的公共方法,那么您的代码可能"闻起来"…

记住继承模型是"Is A"

所以在你的例子中,Encap 是一个测试,你应该能够对Encap做任何你可以对测试做的事情。

然而,如果你只是必须从一个你不想公开父类方法的类继承,你可以重写这个方法,让它的主体什么都不做。但对于简单的getter和setter访问方法,这可能会让代码的客户端感到非常困惑。

如果你不能调和的事情和调用setValue()上的Encap从来都不是正确的事情,我建议重写的方法,自由地评论它,让它什么都不做,或者抛出一个异常,以表明客户端,他们正在做的事情是没有意义的。

最新更新