19

假设我有 classes A, B, 并且CclassC具有可读和可写属性:

public class C {
    private int i = 0;

    // Writable.
    public void increment() { i++; }

    // Readable.
    public int getScore() { return i; }
}

是否可以只让A使用increment()方法,只让B使用getScore()方法?

4

6 回答 6

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) { /* ... */ }
}

当然,存在安全隐患,但这应该让您朝着正确的方向思考。

于 2013-02-05T22:33:21.807 回答
6

是的,但你必须经历一些回旋。

public interface Incrementable {
    public void increment();
}

public interface Readable {
    public int getScore();
}

public class C implements Incrementable, Readable
{
    ...
}

现在,当您在 A 中定义接收对B实例的引用的方法时,请定义该方法以Incrementable取而代之。对于B,将其定义为Readable

于 2013-02-05T22:34:40.553 回答
3

Java 有 4 个作用域:私有、受保护、公共和“包”。可以从任何地方访问公共的东西。仅受子类保护。private 只是那个类。“包”范围未命名,但如果省略其他三个中的任何一个,则假定为包范围。这只能由同一包中的其他类访问。

HTH。

于 2013-02-05T22:33:17.250 回答
2

不,这是不可能的。

于 2013-02-05T22:32:25.657 回答
2

不是你想要的,但你可以去堆栈跟踪(创建一个异常)并检查调用你的增量方法的类。

于 2013-02-06T00:11:25.913 回答
1

尽管直接的答案是否定的,但另一种解决方法(丑陋的)可能是创建两个扩展第三个接口(或者您可以只将对象作为参数):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++;
     } 
}
于 2013-02-05T22:38:31.060 回答