我有两个班级Test
和Encap
。我有一个私有变量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();
}
}
答案 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()永远不是正确的事情,我建议覆盖该方法,自由地评论它并让它什么都不做,或抛出一个异常来指示客户说他们正在做一些没有意义的事情。