我们假设我有类A
,B
和C
,其中类C
具有可读写属性:
public class C {
private int i = 0;
// Writable.
public void increment() { i++; }
// Readable.
public int getScore() { return i; }
}
是否可以仅让A
使用increment()
方法,只允许B
使用getScore()
方法?
答案 0 :(得分:29)
考虑将您的类分成单独的接口,以便每个类只获得一个具有所需接口的对象。例如:
interface Incrementable { public void increment(); }
interface HasScore { public int getScore(); }
class C implements Incrementable, HasScore { /* ... */ }
class A {
public A(Incrementable incr) { /* ... */ }
}
class B {
public B(HasScore hs) { /* ... */ }
}
当然,有安全隐患,但这应该让你思考正确的方向。
答案 1 :(得分:6)
是的,但是你必须经历一些旋转。
public interface Incrementable {
public void increment();
}
public interface Readable {
public int getScore();
}
public class C implements Incrementable, Readable
{
...
}
现在,当您在A中定义接收对B
实例的引用的方法时,请定义该方法以取代Incrementable
。对于B
,请将其定义为Readable
。
答案 2 :(得分:3)
Java有4个范围:private,protected,public和“package”。可以从任何地方访问公开的内容。仅受子类保护。私人只是那个阶级。 “package”范围未命名,但如果省略其他三个范围,则假定包范围。这只能由同一个包中的其他类访问。
HTH。
答案 3 :(得分:2)
不,不可能这样做。
答案 4 :(得分:2)
不是你想要的,但你可以上堆栈跟踪(创建一个异常)并检查调用你的增量方法的类。
答案 5 :(得分:1)
虽然直接的答案是否定的,但另一种解决方法(丑陋的)可以创建两个扩展第三个的接口(或者你可以将一个Object作为参数): Reader和Writer,将调用类作为参数传递给每个函数:
public interface Caller;
public interface Reader extends Caller;
public interface Writer extends Caller;
public void increment(Caller c) {
if (c instanceof Writer) {
i++;
}
}