Имеется класс, имеющий свой набор св-в. Им владеет другой класс, а этим ещё один. Каким образом с точки зрения ООП лучше всего изменить св-ва самого вложенного объекта. Пример.
class Signal
{
public:
void SetColor(Color &);
Color GetColor() const;
void SetOpacity(double );
double GetOpacity() const;
.. и так далее
};
class View
{
public:
void AddSignal(int id);
private:
SignalCollection m_signals;
};
class Window
{
private:
View m_view;
};
Как лучше всего, имея объект класса Window и id сигнала, поменять его свойства, наиболее правильным способом.
На данный момент сделано так:
class View
{
public:
void AddSignal(int id);
void SetSignalColor(int signalId, Color &color)
{
m_signals[id]->SetColor(color);
}
};
class Window
{
public:
void SetSignalColor(int signalId, Color &color)
{
m_view.SetSignalColor(signalId, color);
}
private:
View m_view;
};
С текущим подходом, при добавлении нового св-ва в Signal, необходимо менять интерфейс View и Window. Что уже кажется странным.
Как бы вы это сделали?
On 12.01.2011 13:54, uKCuH wrote:
Замечательно сделано.
> С текущим подходом, при добавлении нового св-ва в Signal, необходимо менять
> интерфейс View и Window. Что уже кажется странным.
Это нормально. Если ты СКРЫВАЕШЬ сигнал внутри view, а view внутри окна.
> Как бы вы это сделали?
Если свойств у сигнала очень много, можно было бы сделать метод,
возвращающий ссылку на N-ый сигнал данного окна, и после этого
пользователь класса окна уже может делать с этим сигналом всё, что ему угодно.
Если свойств у сигнала мало, и сигнал хочется скрыть в реализации окна,
я бы так и сделал, как сделал ты. Если свойств много, и можно не скрывать,
то сделал бы так, как я написал.
Posted via RSDN NNTP Server 2.1 beta
Здравствуйте, uKCuH, Вы писали:
KCH>Имеется класс, имеющий свой набор св-в. Им владеет другой класс, а этим ещё один. Каким образом с точки зрения ООП лучше всего изменить св-ва самого вложенного объекта. Пример.
KCH>KCH>class Signal
KCH>{
KCH> public:
KCH> void SetColor(Color &);
KCH> Color GetColor() const;
KCH> void SetOpacity(double );
KCH> double GetOpacity() const;
KCH> .. и так далее
KCH>};
KCH>class View
KCH>{
friend class Window;
KCH>public:
KCH> void AddSignal(int id);
protected:
Signal& GetSignal(int signalId);
KCH>private:
KCH> SignalCollection m_signals;
KCH>};
KCH>class Window
KCH>{
public:
template <class F, class A>
void DoSomethingWithSignal(int signalId, F func, A& a)
{
Signal& sig = m_view.GetSignal(signalId);
(sig.*func)(a);
}
KCH>private:
KCH> View m_view;
KCH>};
использовать так:
Window wnd;
wnd.DoSomethingWithSignal(id, &Signal::SetColor, color);
И реализация скрыта (почти) и в нескольких местах методы не добавлять, единственно добавить шаблонов с нужным числом аргументов.