[英]Ability to use Methods from 1 class in another in Java
假设您有一个类A。A创建一个类B的实例,而后者又创建一个类C的实例。
类A是一种主要方法,其唯一的工作就是创建类B的实例。类B是一个模拟器,其中包含一些方法,这些方法针对X个“步骤”运行程序。 C类具有一个GUI,一个按钮和一个可以更新的网格,其中包含执行此操作的所有方法。
为了使C类中的按钮起作用,它必须使用B类中的方法,而该方法又使用C类中的另一个方法。
C是否可以使用B中的方法,而无需在C中创建B的另一个实例?
单击按钮后,C中的代码,
[snip]
for(int i = 0; i < numberOfSteps; i++){
B.simulateOneStep();
}
[snip]
这会在B中运行以下代码,
public void simulateOneStep()
{
step++;
List<Animal> newAnimals = new ArrayList<Animal>();
for(Iterator<Animal> it = animals.iterator(); it.hasNext(); ) {
Animal animal = it.next();
animal.act(newAnimals);
if(! animal.isAlive()) {
it.remove();
}
}
animals.addAll(newAnimals);
C.showStatus(step, field);
}
根据我进行的测试,simulateOneStep()方法将在C.showStatus()行之前运行,此后直到初始for循环的最后一次迭代(即10个步骤,您应该看到10个不同的显示)之后才运行此行。该程序可以正常运行所有10个步骤,但是只显示最后一个步骤)。
这样可以运行方法吗? 我试图在C类方法的for循环中添加showStatus(),但这没有区别。
通常的做法是C
引用其“父” B
对象。
一般而言,模型(在这种情况下为模拟)在理想情况下应该与UI无关(即,它应该具有对UI的深入了解,例如实现细节或布局细节)。 在不使用成熟的MVC的情况下,实现此目标的一种方法是使用Observer Pattern 。
我不确定我是否理解您的要求,但是还是让我们试一下。
您是否要呼叫C.showStatus(step,field); 10次?
如果是这样,我认为您应该只在if语句之后将它包括在for循环中。
我看到四个选项。
首先,正如@ louis-wasserman所说,将引用传递给父对象,因此C的构造函数将类似于:
private B sim;
public C(B sim){
this.sim = sim;
}
B将使用以下代码创建它:
C gui = new C(this);
当按下按钮时,C会调用:
sim.simulateOneStep();
其次(我最不喜欢),使B中的所有内容均为静态-所有其方法和变量。 然后,C可以直接通过以下方式引用它:
B.simulateOneStep();
如果您采用这种方式,则最好给B一个主要方法,而忽略A。
第三,您可以让A管理模拟器和gui的创建,以便C看起来与第一个解决方案相同,但是A会因此在main中创建每个实例的实例:
B sim = new B();
C gui = new C(sim);
sim.init();
C.begin();
第四,您可以将B的实例设为A的公共静态属性,然后C可以引用它。
在所有这些中,我最喜欢选项一和三个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.