Возможность использовать методы из одного класса в другом в Java - PullRequest
0 голосов
/ 31 марта 2012

Предположим, у вас есть класс A. A создает экземпляр класса B, который, в свою очередь, создает экземпляр класса C.

Класс A является основным методом, и его единственной задачей является создание экземпляра.класса B. Класс B является симулятором, содержащим несколько методов, которые запускают программу для X «шагов».Класс C имеет графический интерфейс, с одной кнопкой и сеткой, которая может обновляться. Он содержит все методы для этого.

Чтобы кнопка в классе C функционировала, она должна использовать метод в классе B, который, в свою очередь, использует другой метод в классе C.

Возможно ли для C использовать метод изB, без создания ДРУГОГО экземпляра B в C?

Код в 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 шагов правильно, однако она отображает только последний).

Возможно ли запускать методы таким способом?Я попытался добавить showStatus () в цикл for в методе класса C. Но это ничего не изменило.

Ответы [ 4 ]

0 голосов
/ 31 марта 2012

Я вижу четыре варианта.
Сначала, как сказал @ 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, управляющий созданием симуляторов и графических интерфейсов, так что C будет выглядеть так же, как в первом решении, но A будет создавать экземпляр каждого в main таким образом:

B sim = new B();
C gui = new C(sim);
sim.init();
C.begin();

В-четвертых, вы могли бы сделать экземпляр B открытым статическим свойством A, к которому C мог бы затем обращаться.

Из всех них мне больше всего нравятся варианты один и три.

0 голосов
/ 31 марта 2012

Вообще говоря, модель (в данном случае симуляция) в идеале должна быть независимой от пользовательского интерфейса (т. Е. Иметь глубокие знания пользовательского интерфейса, такие как детали реализации или особенности компоновки). Не вдаваясь в полномасштабную MVC, одним из способов достижения этого является использование Observer Pattern .

0 голосов
/ 31 марта 2012

Я не уверен, понял ли я то, что вы спрашиваете, но давайте все равно попробуем.

Вы говорите, что хотите вызвать C.showStatus (шаг, поле); 10 раз?

Если это так, я думаю, вы должны просто включить его в цикл for сразу после оператора if.

0 голосов
/ 31 марта 2012

Типичный способ сделать это для C иметь ссылку на его "родительский" B объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...