C++-就像Java中的朋友类机制一样
你知道我怎样才能使一个对象只在一个特殊的类中变化吗? 在本例中,我希望对象PrivateObject仅在C++-就像Java中的朋友类机制一样,java,friend,Java,Friend,你知道我怎样才能使一个对象只在一个特殊的类中变化吗? 在本例中,我希望对象PrivateObject仅在框类中可更改(可增加),而不是在其他地方。有没有办法做到这一点 public class Box { private PrivateObject prv; public void setPrivateObject(PrivateObject p){ prv = p; } public void changeValue(){
框
类中可更改(可增加),而不是在其他地方。有没有办法做到这一点
public class Box {
private PrivateObject prv;
public void setPrivateObject(PrivateObject p){
prv = p;
}
public void changeValue(){
prv.increment();
}
}
public class PrivateObject {
private value;
public increment(){
value++;
}
}
PrivateObject priv = new PrivateObject ();
Box box = new Box();
box.setPPrivateObject(priv);
box.changevalue();
priv.increment(); // I don't want it to be changeable outside the Box class!
<>在C++中,我将使所有的<代码>私有对象属性和方法私有,并声明<代码>框<代码>类作为<代码>私有对象Ob/C>类的朋友。 如果
PrivateObject
与Box
密切相关,为什么不将其作为Box
中的内部类
class Box {
public static class PrivateObject {
private value;
private increment(){
value++;
}
}
private PrivateObject prv;
public void setPrivateObject(PrivateObject p){
prv = p;
}
public void changeValue(){
prv.increment();
}
}
现在您不能从框的外部调用增量:
public static void main(String args[]) {
Box.PrivateObject obj = new Box.PrivateObject();
Box b = new Box();
b.setPrivateObject(obj);
obj.increment(); // not visible
}
最接近的方法是使PrivateObject成为Box的内部类,并使increment
private。这样,该方法将只能在框
类中访问
public class Box {
private PrivateObject prv;
public void setPrivateObject(PrivateObject p) {
prv = p;
}
public void changeValue() {
prv.increment();
}
public static class PrivateObject {
private int value;
private void increment() {
value++;
}
}
}
如果您不想这样做,下一个选项是将increment
package设置为私有,并在同一个包中定位这两个类。这样,只有该包中的类才能访问该方法。但这可能包括Box以外的类。Java没有任何与C++的friend关键字等价的语言特性。但是,有许多应用程序级备选方案:
将PrivateObject
类的increment()
方法声明为同一个包中的package-private和define框
或
2.让调用代码将令牌传递到increment()
-在该方法中检查该令牌是否确实来自框
类,并允许或不允许
其思想是保持PrivateObject
和Box
类之间的耦合可管理。在Java中,您可以通过将多个类放在同一个包中来创建一组“朋友”。然后,对要限制访问的类、方法和字段使用默认范围(无访问说明符)。相关问题