想象一下,您有两个类,Parent
类和继承自Child
的{{1}}类。 Parent
的属性Parent
设置为私有,子类的a
方法需要访问doSomething()
,如:
a
我的问题是:是否有从public class Parent {
private Attriute a;
public Parent(Attribute a) {
this.a = a;
}
}
public class Child extends Parent {
public Child(Attribute a) {
super(a);
}
public void doSomething() {
// Need to access to a here
}
}
访问a
的最佳方式?关于如何继续,我几乎没有想法:
Child
中设置a
的{{1}}的可见性,但随后protected
可以访问,并且可以在包中进行修改。Parent
的{{1}}中创建一个受保护的getter,但它也可以在包中的evrywhere中访问。a
类中创建一个新的私有Parent
字段,并在构造函数中将a
保存到其中。像这样的新的'属性只能从Attribute
访问,并且它与Child
属性相同,但它也会重复'两个班级都a
。但我不知道哪一个是最好的,也许这些都不是,所以帮助!!
答案 0 :(得分:1)
在Java中,没有办法将成员访问子类,而不将其授予同一个包中的所有类。
只需为该字段添加一个getter方法,并将其设为protected
。这提供了比您更喜欢的访问权限,但通常可以接受。
如果封装很关键,您可以将类移动到其包中,并阻止以这种方式允许访问非子类。
答案 1 :(得分:-1)
This也许就是你要找的东西。
创建返回private属性的受保护方法,以及限制因此只有子类可以获取属性。
public class Parent {
private Attribute a;
public Parent(Attribute a) {
this.a = a;
}
protected Attribute getA() throws IllegalAccessException, ClassNotFoundException {
if(!getClass().isAssignableFrom(
Class.forName(new Throwable().getStackTrace()[1].getClassName()))) {
throw new IllegalAccessException(
"This method can be accessed by subclass only");
}
return a;
}
}
public class Child extends Parent {
public Child(Attribute a) {
super(a);
}
public void doSomething() throws IllegalAccessException, ClassNotFoundException {
Attribute a = getA();
}
}