只允许某些类在Java中调用方法

时间:2011-04-23 00:33:14

标签: java inheritance visibility

假设我有这样的结构:

对象A包含对象B的实例 对象B包含Object C的实例

对象D扩展了对象C

我有一个对象D的实例,其他人将在我的程序中编写和使用。有一些关于我希望拥有的对象的信息但是没有给他们访问权限。我目前正在做的是在Object B中存储包含Object D而不是Object C的信息和方法。

问题是,如果我将其设为私有,以便对象D不能使用任何方法,那么我也无法从程序中的任何其他位置访问它们。是否有任何方法可以使D无法访问方法,但其他类可以?

2 个答案:

答案 0 :(得分:4)

如果我正确地理解了您的问题,您可能希望将抽象与实现分离,以便您可以在将来更改实现。

您可以通过实施Bridge Design Pattern来实现这一目标。

修改

回答你的评论:
您无法直接调用CircleShape的公共方法。 DrawingAPI的具体实现(即DrawingAPI1)不应该对CircleShape类的纯粹存在有所了解。如果你以某种方式需要调用调用者的某些方法,只需定义另一个接口并将调用者的引用传递给被调用者:

public interface CircleInfo {
  Color getBorderColor();
  /* some other methods */
}

public class CircleShape implements Shape, CircleInfo {
  public Color getBorderColor() {
    return Colors.Black; // not sure if it works, just an example
  }

  public void draw() {
    drawingAPI.drawCircle(x, y, radius, this);
  }   

  /* Other methods implementation here */
}

// DrawingAPI modification
interface DrawingAPI {
  public void drawCircle(double x, double y, double radius, CircleInfo info);
}

// Concrete implementation
class DrawingAPI1 implements DrawingAPI {
  public void drawCircle(double x, double y, double radius, CircleInfo info) {
    System.out.printf("API1.circle at %f:%f radius %f color %s\n",
      x, y, radius, info.getBorderColor().toString());
}

答案 1 :(得分:1)

听起来D不应该扩展C. D的实例应该可以访问它可以在需要时委托给它的实例。应该使用可以具有C实现的接口键入此委托。该接口将仅包括D应该能够调用的那些方法。您将此接口的实例注入D,以便它可以执行所需的操作。

public interface Delegate {
    public String getInformation();
}

public class C implements Delegate {
    public String getInformation() {...}
    public void otherMethod();
    public void anotherOtherMethod();
}         

public class D {
    private Delegate delegate;

    public D(Delegate delegate) {
        this.delegate = delegate;
    }

    public void printSomething() {
        System.out.println(delegate.getInformation());
    }
}