我上课A
。此类包含两个方法,例如method1()
和method2()
。现在我还有另外两个名为B
和C
的类。两个类都将包含A
类的相同实例。
现在,我希望以我的'B class can only call
method1()and my other
C'类可以调用method2()
的方式限制访问。设计方案如下 -
class A {
void method1(){/*-------------*/}
void method2(){/*-------------*/}
}
现在,如果我创建A
的实例并与我的B
和C
类共享
class B {
A ob;
public B(A ob) {
this.ob=ob;
}
public void process() {
ob.method1(); //only call method1()
ob.method2(); //can't access it.
}
}
class C {
A ob;
public C(A ob) {
this.ob=ob;
}
public void process() {
ob.method2(); //only call method2()
ob.method1(); //can't access it.
}
}
答案 0 :(得分:3)
简单:你做不到。
与C ++中的“friend”概念相比,您只能更改所有其他类的可见性。
换句话说:在Java中,您遇到了受保护,受保护,私有和公开的问题。没有“私人为B”和“公开为C”。
当然,你可以做一些非常奇怪的事情,比如一个方法分析它自己的堆栈跟踪,如果它发现被“错误”调用则抛出异常类。但这样做很可能是不好的做法。
从这个意义上说,真正的答案是:退后一步,仔细看看这两种方法背后的功能。如果你真的认为这些功能需要不同的可见性 - 那么他们可能首先不应该在相同的类中!因为他们可能实现了两个非常不同的职责 - 而且,任何阶级,方法......都应该只有一个责任。
你可以得到的最接近的是smosel的建议:你的类实现了不同的接口,并确保客户端通过“接口”接口使用你的类 - 然后它们在他们可以调用的方法中受到限制。但是当然 - 客户端可以轻松将接口引用转换为类引用,然后调用其他方法。
鉴于评论:单独使用的名称表示上述要点:当A是 ConfigurationLoader 时 - 为什么它包含检查的方法>一个配置? ConfigurationLoader 应加载配置(由C类触发) - 该操作的结果将是“配置”对象 - 然后B类将使用该配置对象(而不是与 loader 交互)。
答案 1 :(得分:3)
一种解决方案是将每个方法移动到自己的接口中,并start_session();
$_SESSION['user_id'] = $login;
header("Location: index.php");
exit();
实现两个接口:
A
现在,您可以将同一个对象interface A1 {
void method1();
}
interface A2 {
void method2();
}
class A implements A1, A2 {
@Override public void method1() {}
@Override public void method2() {}
}
传递给A1
,将B
传递给A2
。您可以将其投放到C
以访问任一方法(取决于A
的可见性),但这不太可能发生错误。
答案 2 :(得分:0)
您应该根据https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
中指定的java访问级别规则来安排您的类层次结构根据您的需求,您可以将method1
和method2
放入不同的类别,例如A1
和A2
。然后,A1
将与B
位于同一个包中,A2
将与C
位于同一个包中。应该使用no modifier定义类。
答案 3 :(得分:0)
您可以使用2个适配器类,并在a和b中使用不同的类。 对我来说似乎有点矫枉过正。 另一种认为你可以做的是创建方法3,它调用方法1或2并决定它在实例化时调用哪一个。
答案 4 :(得分:0)
从技术上讲,有几种方法可以执行此操作,例如将方法声明为private
,然后使用反射仅调用允许执行此操作的类中的相应方法。然而,这种设计与Java原则形成对比,使用它通常不是一个好主意。最好的办法是重新设计方法,以达到理想的效果。