LINUX.ORG.RU

Взаимодействие разных классов

 ,


0

1

Добрый день, Лоровцы.

Подскажите какой подход выбрать, чтобы реализация была более простой и наглядной?

Привожу сокращенно код в упрощенном виде, схематично.
Есть класс А от которого унаследованы другие:

class A{
  int i,j,k; // некоторые параметры
  virtual void fun() = 0;
}

class B:public A{
  void fun(){...}; //своя реализация
}

class B:public A{
  void fun(){...}; //своя реализация
}

Есть и другой класс для сложных вычислений, который использует потомки класса А и его параметры:

class D{
  void foo1(){
  for (A it = iterator ...)
    it->fun();
}

void foo2(){
  // здесь используются параметры i,j,k класса A для вычислений
}

Как использовать класс А в классе D? Передавать через параметры или лучше эти классы связать, например, с помощью шаблонных методов?

★★★★★
Ответ на: комментарий от andreyu

Есть почти несвязанные классы. Но чтобы провести вычисления в методах класса D необходимо знать параметры класса А и вычислить некоторые значения с помощью методов потомка класса А. Вот как это все склеить по нормальному.

Zodd ★★★★★
() автор топика

Если на значения i, j, k нет никаких ограничений, то просто сделай их публичными и передавай объект спокойно. Ну или пользуй через геттеры/сеттеры, если любитель возни с ними.

А шаблоны, имхо, лучше не использовать там, где вполне не плохо без них.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от fluorite

Пока не планировал. Скорее нет. Только этих параметров у меня около десятка. Вручную все передавать/таскать не хочется.

Zodd ★★★★★
() автор топика

лучше через DI

anonymous
()
Ответ на: комментарий от Zodd

Может тебе тогда завести отдельную структуру параметров, и держать её как член класса D (либо вообще инициализировать в foo2())?

fluorite ★★★★★
()

Раз класс D не может ничего полезного делать без класса A, то наверное имеет смысл делать через внедрение зависимостей (dependency injection). Что касается потомков класса A, то тут на помощь придут вирутальные методы. Получается, что в итоге D будет принимать в качестве зависимостей один или несколько экземпляров A, а уже внутри в вычислениях вызываться нужная реализация от потомка.

CARS ★★★★
()
Ответ на: комментарий от CARS

наверное имеет смысл делать через внедрение зависимостей (dependency injection).

несмотря на некоторые недостатки оно, как выясняется потом меньшее зло и весьма полезно

anonymous
()
Ответ на: комментарий от Zodd

Да там ничего сложного по сути нет. Если класс X зависит от класса Y, то можно либо в X сделать конструктор, принимающий Y (как правило применяется, если зависимость обязательная) или добавить метод setY(Y y) (если опциональная зависимость). А потом в отдельном месте создаем сначала экземпляр Y, потом через него экземпляр X. Это уже и будет простейшим вариантом DI. В больших приложениях, когда граф зависимостей сложен, то руками разруливать создание объектов в правильном порядке становится сложно, и тогда используют IoC-контейнеры. Для Java стандарт де-факто — это Spring, а вот что используется в мире C++ не знаю.

CARS ★★★★
()
Ответ на: комментарий от CARS

Ок, понял. Еще один вопрос: если у меня будет набор классов vector<X*> x; то как его связать с классом Y, также?

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Если несколько X зависят от одного и того же Y, то тоже всё довольно очевидно. Сначала создаем один объект Y, а потом в цикле заполняем список X, чтобы в каждый X «внедрилась» одна и та же зависимость в виде Y.

С другой стороны уже можно заметить, что начала проявляться логика (пока только в виде цикла) в коде создания системы. Опять же, если сложность взаимосвязей объектов будет высока, то лучше брать IoC-фреймворки. Как правило, они позволяют описать все зависимости декларативно (не в коде, а например в отдельном конфиге). Потом этот конфиг скармливается приложению, «под капотом» IoC-контейнера всякие конструкторы и сеттеры вызываются в нужном порядке, и на выходе получается готовая система с правильно связанными компонентами.

CARS ★★★★
()

Сделать ифейс для «некоторых параметров». Очевидно же.

anonymous
()
Ответ на: комментарий от Zodd

Есть почти несвязанные классы. Но чтобы провести вычисления в методах класса D необходимо знать параметры класса А и вычислить некоторые значения с помощью методов потомка класса А

А почему нельзя тупо сделать такую иерархию: A > AChild > D ?

anonymous
()
Ответ на: комментарий от CARS

Спасибо. Дальше уже разберусь, надо было все по полкам только разложить.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Потому что child'ов несколько

И что с того?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.