Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полиморфная модификация объектов 
:(
    Опции темы
math64
Дата 17.11.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



mes,  В обоих ваших примерах нельзя определить несколько свойств одного типа, правда, в некоторых случаях можно вывернуться - для линии использовать pair<point,point>, для полигона - vector<point>.
И регистрировать в мутаторе лучше не объект, а геттер и сеттер.

Исходя из назначения (разводка печатных плат, как я понял), объекты делятся на две категории: примитивы (point, rect, line. circle, arc, polyline, polygon, path, text) - новые понадобятся редко, если нужно что-то новой формы - есть path.
Вешать на них интерфейсы, мутаторы и т.д. - не рационально, всё это займёт больше места, чем сам примитив.
Но если новые примитивы добавляются редко, можно применить visitor.
Компоненты высокого уроня: component, connection, lay
Новые компоненты создаются в редакторе компонентов, как правило, без создания новых классов C++ - здесь как раз мутаторы уместны. Но нужно иметь возможность динамического добавления свойств.
PM   Вверх
mes
Дата 17.11.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  09:24 Найти цитируемый пост)
В обоих ваших примерах нельзя определить несколько свойств одного типа,

в QI нельзя получить два одинаковых интерфейса .. все зависит от задачи smile
нужнен массив точек,определите такое свойство.. 

Цитата(math64 @  17.11.2011,  09:24 Найти цитируемый пост)
И регистрировать в мутаторе лучше не объект, а геттер и сеттер.

у геттера/сеттера нет типа.. нужен отдельный геттер/сеттер сделайте такой микс.. smile

Добавлено через 1 минуту и 17 секунд
Цитата(math64 @  17.11.2011,  09:24 Найти цитируемый пост)
Вешать на них интерфейсы, мутаторы и т.д. - не рационально, всё это займёт больше места, чем сам примитив.

экономичность это следущий шаг.. пока я лишь показал какие еще варианты бывают smile
чтоб не было зацикливания на imoveable smile


--------------------
PM MAIL WWW   Вверх
math64
Дата 17.11.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(mes @  17.11.2011,  10:50 Найти цитируемый пост)
у геттера/сеттера нет типа.. нужен отдельный геттер/сеттер сделайте такой микс..

Можно сделать так:
Код

class Rect {
  Point location;
  Size size;
public:
  Point getLocation() const { return location; }
  Size getSize() const { return size; }
  void selLocation(Point loc);
  void setSize(Size sz);
  static Point getLocation(const Rect&r) { return r.getLoation(); }
  static Size getSize(const Rect&r) { return r.getSize(); }
  static void setLocation(Rect&r, Point pt) { r.setLocation(pt); }
  static void setSize(Rect&r, Size sz) { r.setSize(sz); }
};

У статических методов тип уже есть - их можно добавить в map (лучше не в тот, куда добавляют объекты, а в отдельные для геттеров и сеттеров)
Но в общем, как делать уже ясно - детали зависят от конкретной реализации.
PM   Вверх
mes
Дата 17.11.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  10:53 Найти цитируемый пост)
У статических методов тип уже есть

о каком типе идет речь ? я о том который вытупает в роли идентификара свойства/интерфейса



--------------------
PM MAIL WWW   Вверх
math64
Дата 17.11.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Вот такие типы:
Код

typedef Point (*PointGetterOfRect)(const Rect&r);
typedef Size (*SizeGetterOfRect)(const Rect&r);
typedef void (*PointSetterOfRect)(Rect&r, Point pt);
typedef void (*SizeSetterOfRect)(Rect&r, Size sz);


PM   Вверх
mes
Дата 17.11.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  16:15 Найти цитируемый пост)
Вот такие типы:

это не позволяет определенно и однозначно соотнести тип к методу..

а тс. чего то не видно.. или это я такой нетерпеливый.. 

Это сообщение отредактировал(а) mes - 17.11.2011, 18:49


--------------------
PM MAIL WWW   Вверх
math64
Дата 17.11.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



mes, вот определяется (добавить недостающие куски из Вашего примера):
Код

typedef void(*setter)(int&,const int&); // на тот случай, если указатели на функции и обычные указатели разных размеров
std::map<mixid_t, setter> setters;
template <typename G, typename T>
  void call_setter(G& g, const T& t) {
    typedef void (*setter)(G&,const T&);
    ((setter)setters[mix_type<setter>::get_id()])(g, t);
  }

void set(figure&,const int&) { std::cout << "set" << std::endl; }

int main ()
{
  figure f1;
  void (*_setter)(figure&,const int&) = set;
  setters[mix_type<void (*)(figure&,const int&)>::get_id()] = (setter)_setter;
  int two = 2;
  call_setter(f1, two);
}

Без typedef можно обойтись.
PM   Вверх
mes
Дата 17.11.2011, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  18:48 Найти цитируемый пост)
mix_type<void (*)(figure&,const int&)>::get_id()]

ну и ? увсех сеттеров типа void (*)(figure&,const int&), а их множество, будет один и тот же тип.. 
про ограничения на кол-во аргументов мы промолчим .. 
во вторых как будет выглядить пользователем получение это сеттера.. 
да и вообще зачем нам эти сеттеры ?   интерфейсы (мутаторы) намного более симпатичны.. на один ид  отражены сразу все необходимые методы в удобном и привычном виде..
 




--------------------
PM MAIL WWW   Вверх
math64
Дата 17.11.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(mes @  17.11.2011,  20:05 Найти цитируемый пост)
ну и ? увсех сеттеров типа void (*)(figure&,const int&), а их множество, будет один и тот же тип..

Так и в Вашем примере для одного типа возможен один мутатор - устранение этого ограничения аналогично.

Цитата(mes @  17.11.2011,  20:05 Найти цитируемый пост)
да и вообще зачем нам эти сеттеры ?

Ну вот нужно установить центр Rect. Поля Point center нет, а есть левый верхний угол. А если и есть, всё равно нужно сделать перерасчёт
левого верхнего угла, а если хранить и остальные углы -  то и их.
PM   Вверх
math64
Дата 17.11.2011, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Чтобы уйти от сеттеров можно использовать паттерн Observer - это рентабельно, если будем его применять для объектов высокого уровня
Код


struct Observer<T> {
virtual void onChanged(T& t, const T& old) = 0;
};

struct Rect {
  Point location;
  Size size;
  Observer<Rect>* observer;
  Rect(const Rect& r) : observer(0) {
    location = r.location; size = r.size;
  }
  Rect& operator =(const Rect&r) {
    Rect save = *this;
    location = r.location; size = r.size;
    if (observer)
     observer->onChanged(*this, save);
    return *this;
  }
};

struct Component : public Observer<Rect> {
Rect boundRect;
Component() { boundRect.observer = this; }
void onChanged(Rect& old, const Rect& _new);
};



Это сообщение отредактировал(а) math64 - 17.11.2011, 20:45
PM   Вверх
mes
Дата 17.11.2011, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  19:43 Найти цитируемый пост)
Чтобы уйти от сеттеров можно использовать паттерн Observer - это рентабельно, если будем его применять для объектов высокого уровня

да, только как относится наблюдатель к нашей задачи по динамическому описанию любого типа фигуры ?
или вы уже следующую решаете ?

Цитата(math64 @  17.11.2011,  19:19 Найти цитируемый пост)
Так и в Вашем примере для одного типа возможен один мутатор - устранение этого ограничения аналогично.

один мутатор/интерфейс про ид.. или множество про один ид smile 

Цитата(math64 @  17.11.2011,  19:19 Найти цитируемый пост)
Ну вот нужно установить центр Rect. Поля Point center нет, а есть левый верхний угол. А если и есть, всё равно нужно сделать перерасчёт
левого верхнего угла, а если хранить и остальные углы -  то и их. 

smile 
Так в том то и дело, что мой пример был направлен на уход от подобной традиции.. 
В C++ООП  мы представляем что класс это набор данных и методов описанных вместе.. 
В НашемОП , есть объекты предоставляющие данные и модули содержащие методы по их обработке smile
  


Это сообщение отредактировал(а) mes - 17.11.2011, 23:56


--------------------
PM MAIL WWW   Вверх
math64
Дата 17.11.2011, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Observer прекрасно сочетается с Вашими мутаторами  (при разделении на примитивы, для которых применяется обычное программирование, и объекты высокого уровня) -  я не стал приводить общий пример.
Но возможно, у Вас другой взгляд на построение системы - нужно послушать ТС.

PM   Вверх
math64
Дата 17.11.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Я понял Вашу концепцию - Rotatoin не хранит угол поворота,  а делает поворот (из Вшего примера это было не очень ясно - следовло бы написть комментарий). В этом случае сеттеры действительно не нужны. Обсерверы, если и нужны, то редко.
PM   Вверх
mes
Дата 17.11.2011, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  17.11.2011,  21:12 Найти цитируемый пост)
Я понял Вашу концепцию - Rotatoin не хранит угол поворота,  а делает поворот

не совсем так, возможно как хранение даных и/или воздействие тад ними, так и проксирование действия...  все зависит от выбранной модели.. 


Цитата(math64 @  17.11.2011,  21:12 Найти цитируемый пост)
из Вшего примера это было не очень ясно - следовло бы написть комментарий

ну я  вроде бы и написал:
Цитата(mes @  16.11.2011,  18:48 Найти цитируемый пост)
все представленные миксы самодостаточные, но вполне допустимы и захватывающие контекст..


мне уже по почте писали, что мой стиль труден для восприятия.. но я честно не специально.. если не понятно покажите момент, и я с удовольствие попробую объснить другими словами..

Цитата(math64 @  17.11.2011,  21:12 Найти цитируемый пост)
Обсерверы, если и нужны, то редко. 

Вы имеете ввиду средства обратной связи для взаимодествия между разными свойствами внутри объекта ?
в большинстве случаев это не имеет смысла, потому какв рамках предложенноймодели, стоит рассматривать объект, как набор данных(т.е. как структуру), а не как единицу поведения (объект ООП) 





--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 30.11.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Доброе утро.

Извиняюсь что пропал, ненадолого уехал из города. Сегодня попробую все осмыслить и продолжить тему.

Это сообщение отредактировал(а) azesmcar - 30.11.2011, 09:31
PM   Вверх
Страницы: (11) Все « Первая ... 8 9 [10] 11 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.