состав.Передать переменные обратно - PullRequest
2 голосов
/ 12 апреля 2011

Скажем, у вас было два класса A и B. Если связь между имеет has-a

, то есть A has-a B

, как вы можете передавать информацию из B в A?Скажем, например, в B вы выполняете расчет и вам нужен ответ в A.

Есть ли другой способ сделать это, кроме передачи указателя на класс A в класс B и вызова функции, которая принимает ответ какпараметр.

Надеюсь, это имеет смысл,

MD.

Извините, я должен был быть более точным

цитата из моего комментария ниже.

"хорошо, я привел простой пример. Я программирую это на Java, и мой класс B запускает новый поток и вычисляет ответ. Поэтому я не могу просто вызвать функцию из класса A, так как не знаю, когдаРасчет будет завершен. "

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011

Метод в A, которому требуется результат вычисления, должен вызывать метод в B, который выполняет вычисления.

Этот ответ настолько очевиден, что может быть что-то, о чем вы нам не говорите (?)

Хорошо, вопрос действительно о потоках. Да, тогда передача ссылки на объект владельца и обратный вызов в него может быть хорошей идеей. Лучшей идеей может быть возвращение будущего объекта , который инкапсулирует результат вычисления.

1 голос
/ 12 апреля 2011

Существует два основных способа управления «асинхронными» вызовами.Первый имеет обратный вызов, а другой опрос.Описывать обратный звонок - вот что.Когда B закончил, ему нужно как-то вызвать A, чтобы завершить.Это может быть сделано путем «передачи» адреса от A до B, чтобы он знал, что вызывать, или с помощью промежуточного объекта C, который вызывает B синхронно и отправляет результат обратно A. Затем C должен знать о A.

Опрос производится, когда A регулярно проверяет, завершил ли B.Это решение обычно менее удовлетворительно интеллектуально и потребляет больше ресурсов процессора.Вы также не уведомлены точно, когда B закончил.(Когда B закончится, ничего не произойдет, вам придется ждать следующего опроса, чтобы узнать об этом).Однако в этом случае B не нужно ничего знать о A.

Я бы использовал первый шаблон с промежуточным объектом (и специальным классом C).Так что ваша модель все еще чиста (B не нужно знать об A или C).Я также предлагаю вам взглянуть на шаблон Observer .

1 голос
/ 12 апреля 2011

Если я правильно понимаю, у вас такие отношения:

class Car {
    Engine engine;

    int test() {
        int fuelLevel = engine.getFuelLevel();

        // do sth with fuel level, store it, use it etc.
   }
}

Этот пример показывает, как вы можете передавать информацию между двумя классами: например, в результате функции. Объект Car (ваш класс A) вызывает метод для объекта Engine (класс B), и таким образом он получает требуемую информацию. Это можно легко перевести на любую работу, которую выполняет класс B.

...