Как связать два класса в Java? - PullRequest
1 голос
/ 02 декабря 2010

Как связать два Java-класса?

Я программирую 3D-программу opengl, где у меня есть несколько разных классов. Я знаю, как связать классы с основным классом, но я не могу связать два отдельных класса вместе. У меня есть класс Terrain, где у меня есть список, содержащий некоторые данные о местности. Затем мне нужны эти данные в другом классе под названием Figure, который не является основным классом. Я пытался связать эти классы вместе так:

В классе Terrain у меня есть:

Figure fig;

public void bindClasses(Figure fg) {
   fig = fg;
}

А потом в классе Figure у меня есть:

Terrain ter;

public void bindTerrain(Terrain tr) {
   ter = tr;
}

И затем в обоих классах я вызываю эти функции. Разве это не должно связывать их и их переменные? По крайней мере, так я связал свои занятия с основным классом.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Просто чтобы начать с терминологии. class - это план, который сообщает вам, как выглядит экземпляр объекта - в момент написания new Figure() вы создали экземпляр, объект из класс Figure (часто у вас есть несколько объектов одного класса ). Поэтому, когда вы «привязываете» выше, вы на самом деле не связываете классы, вы связываете объекты .

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

public class Terrain {

    Figure fig

    public void setFigure(Figure fig) {
       this.fig = fig;
    }

}

public class Figure {

    Terrain ter

    public void setTerrain(Terrain ter) {
       this.ter = ter;
    }

}

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

public void init() {

   Terrain ter = new Terrain();   // create object of class Terrain
   Figure fig = new Figure();     // create object of class Figure

   ter.setFigure(fig);
   fig.setTerrain(ter);

}

Например, если между двумя объектами существует связь, вы не можете создать фигуру, не имея ландшафта, в который ее поместите. Это сделало бы ландшафт почти "собственной" фигурой. Вы можете указать это, используя конструктор на рисунке.

public class Figure {

    Terrain ter

    // constructor requires an instance of Terrain, 
    // since the figure must always be placed in a terrain
    public Figure(Terrain ter) {

       this.ter = ter;

       // let terrain know this is the main figure.
       ter.setFigure(this);          
    }

}

Теперь ваш код инициализации будет выглядеть так:

public void init() {

   Terrain ter = new Terrain();   // create object of class Terrain
   Figure fig = new Figure(ter);  // create object of class Figure in the terrain

   // no setters needed, since figure constructor sets up
   // the relationship.

}
2 голосов
/ 02 декабря 2010

Двухстороннее связывание, как и у вас, возможно, но «сложно» с точки зрения дизайна, а также с технической точки зрения.

способ достижения этого:

public void addFigureToTerrain(Figure f){
   //addFigureToTerrainList
   f.registerTerrain(this);
}

Теперь я бы порекомендовал вам подумать, если вам нужна такая связь между классами?

обычно проще и практичнее иметь общий объект (ландшафт), который содержит список объектов (фигур). затем общий объект объединяет / обновляет список (например: figure.hasRecieveEventAttack (атака) или figure.whatDoYouWantToDo ()) и затем общий объект (ландшафт) анализирует ответ

0 голосов
/ 02 декабря 2010

Для этой ситуации вы можете использовать Шаблон инверсии управления (IoC).Примером является Внедрение зависимостей , которое является специфической реализацией IoC

. С помощью этого шаблона вы можете избежать связи между вашим классом Terrain и Figure.(Ландшафт зависит от рисунка, а рисунок зависит от ландшафта.)

В нескольких словах у вас есть контейнер, который позаботится о «внедрении» атрибутов, необходимых для каждого объекта, поэтому вам не придется его жестко кодировать.1009 *

Spring - это контейнер, который делает это.

...