Разрешить только некоторым классам вызывать метод в Java - PullRequest
3 голосов
/ 23 апреля 2011

Допустим, у меня есть такая структура:

Объект A содержит экземпляр Объекта B
Объект B содержит экземпляр объекта C

Объект D расширяет Объект C

У меня есть экземпляр объекта D, который другие люди будут писать и использовать в моей программе. Есть некоторая информация об этом объекте, которую я хочу иметь, но не могу дать им доступ к ней. В настоящее время я храню эту информацию и методы в объекте B, который содержит объект D вместо объекта C.

Проблема в том, что если я сделаю его закрытым, чтобы объект D не мог использовать ни один из методов, то я также не смогу получить к ним доступ из любого места в программе. Есть ли способ сделать так, чтобы D не мог получить доступ к методу, а другие классы могут?

Ответы [ 2 ]

4 голосов
/ 23 апреля 2011

Если я правильно понял вашу проблему, вы, вероятно, захотите отделить абстракцию от реализации, чтобы можно было изменить реализацию в будущем.

Это можно сделать, внедрив Шаблон проектирования моста .

РЕДАКТИРОВАТЬ

Чтобы ответить на ваш комментарий:
Вы не можете напрямую вызывать публичный метод 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 голос
/ 23 апреля 2011

Звучит так, будто D не должен расширять C. Вместо этого экземпляр D должен иметь доступ к экземпляру, которому он может делегировать при необходимости. Этот делегат должен быть набран с интерфейсом, который вы можете использовать в Си. Интерфейс будет включать только те методы, которые 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...