假设我有这样的结构:
对象A包含对象B的实例 对象B包含Object C的实例
对象D扩展了对象C
我有一个对象D的实例,其他人将在我的程序中编写和使用。有一些关于我希望拥有的对象的信息但是没有给他们访问权限。我目前正在做的是在Object B中存储包含Object D而不是Object C的信息和方法。
问题是,如果我将其设为私有,以便对象D不能使用任何方法,那么我也无法从程序中的任何其他位置访问它们。是否有任何方法可以使D无法访问方法,但其他类可以?
答案 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());
}
}