繁体   English   中英

能够在Java中使用另一类的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM