如何将两个Java类绑定在一起?
我正在编写一个3D opengl程序,我有几个不同的类。我知道如何将类绑定到主类,但我不能将两个单独的类绑定在一起。我有一个类Terrain,我有一个包含有关地形的一些数据的列表。然后我需要另一个名为Figure的类中的数据,这个类不是主类。我试图将这些类绑定在一起,如下所示:
在地形课上我有:
Figure fig;
public void bindClasses(Figure fg) {
fig = fg;
}
然后在图类我有:
Terrain ter;
public void bindTerrain(Terrain tr) {
ter = tr;
}
然后在这两个类中我称这些函数。不应该绑定他们和他们的变量?至少我是如何将我的类与主类绑定的。
答案 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是一个执行此操作的容器。