Как получить доступ к объектам основного класса в других классах без конструктора в проекте обработки / Java Eclipse? - PullRequest
1 голос
/ 26 октября 2010

Кажется, я нигде не могу найти ответ в интернете.

Итак, у меня есть проект обработки в Eclipse

Я хочу иметь возможность доступа к объектам в моем "главном" классе, который расширяет PApplet в другом классе, не пропуская их через конструктор. Я не самый опытный программист, поэтому моя терминология может быть неправильной, но, надеюсь, этот пример проясняет, что я пытаюсь сделать.

так что для


public class Main Extends PApplet{

    //Example Class to access objects from main
    Interaction interaction;   

    //Example Objects I want
    boolean someObject;

    void setup(){        
        someObject = true;
        Interaction = new Interaction();  
    }

    void draw(){
    }   
}

public class Interaction{

    PApplet p;

    public Interaction(PApplet parent){
        p = parent;
    }

    public void mousePressed(){
        if(someObject){
            //do something
        }   
    }
}  

так что я знаю, что могу передать этот объект в конструктор Interaction, как

PApplet p;
boolean o;

public Interaction (PApplet parent, boolean SomeObject){
    p = parent;
    o = someObject;
}

но это становится немного сумасшедшим в примере, подобном этому, где я просто хочу сохранить все свои взаимодействия с мышью и клавиатурой в своем собственном классе, потому что он становится огромным, но я столкнулся с необходимостью снова и снова не могу понять это.

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

То, что вы описываете, называется getter методом.

Вы можете добавить метод получения к вашему Main, но сначала прочтите это -> http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

Вотпример.

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   PApplet p;

   public Interaction(PApplet parent){
      p = parent;
   }

   public void mousePressed() {

       if( p.getSomeObject( ) ) {
           //do something
       }

   }
}

Кстати, boolean - это не Object в Java, Boolean - это.

EDIT После вашего комментария я действительно понимаючто вам нужно.

Вам необходимо создать interface и передать этот интерфейс конструктору Interaction.

Этот интерфейс должен предоставлять весь метод, необходимый вашему Interaction.Если ему нужен доступ к PApplet, то это то, что должен предоставить ваш интерфейс.

Имея это в виду, вот новая иерархия:

public interface IInteractionContext
{
  boolean getSomeObject( );
}

public class Main
  extends PApplet
  implements IInteractionContext
{
  @Override
  public boolean getSomeObject ( )
  {
    return someObject;
  }

  ...
}

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   final IInteractionContext ctx;

   public Interaction(IInteractionContext ctx)
   {
      this.ctx = ctx;
   }

   public void mousePressed() {

       if( ctx.getSomeObject( ) )
       {
           //do something
       }

   }
}

С этими изменениями, Interaction может быть все равно, если ctx равно Main, PApplet или Unicorn.Его конструктор запрашивает ожидаемое поведение, и ваша реализация Main обеспечивает такое поведение во время выполнения.

В любом случае прочитайте статью javaworld и связанные с ней статьи.Также читайте статьи о Dependency Injection

1 голос
/ 26 октября 2010

Апплет - это, по сути, контейнер верхнего уровня для приложения, обеспечивающий контекст для взаимодействия с пользователем / отображения и ввода данных (щелчки мыши, клавиатура).

В хорошо спроектированном приложении ваша бизнес-логика должна быть заключена в один или несколько классов, и вы должны вызывать методы для этого на основе внешнего ввода и затем, возможно, запрашивать информацию для вывода в GUI. Это очень большое обобщение.

Контейнер верхнего уровня (в данном случае, апплет) должен заниматься только созданием экземпляров ваших бизнес-объектов, захватом пользовательского ввода, вызовом методов для бизнес-объектов и последующим обновлением графического интерфейса на основе состояния бизнес-объектов.

Я предполагаю, что вы чувствуете себя обязанным обернуть весь свой код взаимодействия в класс, чтобы он был понятен для бизнес-логики. В этом случае бизнес-логику следует инкапсулировать, а не распространять через класс Applet. Это позволит вам легко перенести бизнес-объект в настольное приложение или даже запустить его без графического интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...