如何在java中绑定两个类?

时间:2010-12-02 04:32:20

标签: java class bind

如何将两个Java类绑定在一起?

我正在编写一个3D opengl程序,我有几个不同的类。我知道如何将类绑定到主类,但我不能将两个单独的类绑定在一起。我有一个类Terrain,我有一个包含有关地形的一些数据的列表。然后我需要另一个名为Figure的类中的数据,这个类不是主类。我试图将这些类绑定在一起,如下所示:

在地形课上我有:

Figure fig;

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

然后在图类我有:

Terrain ter;

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

然后在这两个类中我称这些函数。不应该绑定他们和他们的变量?至少我是如何将我的类与主类绑定的。

3 个答案:

答案 0 :(得分:2)

刚开始使用术语。 是一个蓝图,告诉您如何实例化对象 - 当您编写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.

}

答案 1 :(得分:2)

像你这样的双向绑定是可能的,但从设计点视图和技术上来说都是“棘手的”。

实现目标的方法是:

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

现在我建议你仔细考虑一下你们之间是否需要这种联系?

通常,包含对象列表(图形)的一般对象(terrain)更简单,更实用。然后一般对象插入/更新列表(例如:figure.hasRecievedEventAttack(attack)或figure.whatDoYouWantToDo())然后一般对象(terrain)分析答案

答案 2 :(得分:0)

对于这种情况,您可以使用Inversion of Control(IoC)设计模式。 一个例子是Dependency Injection,它是IoC的具体实现

使用此模式,您可以避免Terrain和Figure类之间的耦合。 (地形取决于图和图取决于地形)。

简而言之,您有一个容器,它将负责“注入”每个对象所需的属性,因此您不必对其进行硬编码。

Spring是一个执行此操作的容器。