ООП. Доступ к свойству вложенного объекта
От: uKCuH  
Дата: 12.01.11 10:54
Оценка:
Имеется класс, имеющий свой набор св-в. Им владеет другой класс, а этим ещё один. Каким образом с точки зрения ООП лучше всего изменить св-ва самого вложенного объекта. Пример.

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. Что уже кажется странным.
Как бы вы это сделали?
Re: ООП. Доступ к свойству вложенного объекта
От: MasterZiv СССР  
Дата: 12.01.11 11:05
Оценка:
On 12.01.2011 13:54, uKCuH wrote:

Замечательно сделано.

> С текущим подходом, при добавлении нового св-ва в Signal, необходимо менять

> интерфейс View и Window. Что уже кажется странным.

Это нормально. Если ты СКРЫВАЕШЬ сигнал внутри view, а view внутри окна.

> Как бы вы это сделали?


Если свойств у сигнала очень много, можно было бы сделать метод,
возвращающий ссылку на N-ый сигнал данного окна, и после этого
пользователь класса окна уже может делать с этим сигналом всё, что ему угодно.

Если свойств у сигнала мало, и сигнал хочется скрыть в реализации окна,
я бы так и сделал, как сделал ты. Если свойств много, и можно не скрывать,
то сделал бы так, как я написал.
Posted via RSDN NNTP Server 2.1 beta
Re: ООП. Доступ к свойству вложенного объекта
От: savitar  
Дата: 12.01.11 19:19
Оценка:
Здравствуйте, 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);


И реализация скрыта (почти) и в нескольких местах методы не добавлять, единственно добавить шаблонов с нужным числом аргументов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.