реклама на сайте
подробности

 
 
> си, паттерны ооп, разбиение на объекты, parent's parent, детско-родительские отношения
Idle
сообщение Aug 15 2012, 18:57
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



не использую си++, использую си, абстрактные типы данных через incomplete structure pointer-ы
собственно вопрос, как правильно организовывать взаимодействие объектов, когда "вложенный объект" должен вызывать родителя родителя?

sm.gif ну например, есть палета ящиков с помидорами, ящик с помидорами, и помидор
помидор портится через неделю и вызывает владельца всей палеты, что я мол испорчен sm.gif

что почитать на эту тему с учётом языка?

Сообщение отредактировал Idle - Aug 15 2012, 18:59
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Aug 16 2012, 10:49
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Idle @ Aug 15 2012, 22:57) *
не использую си++, использую си, абстрактные типы данных через incomplete structure pointer-ы собственно вопрос, как правильно организовывать взаимодействие объектов, когда "вложенный объект" должен вызывать родителя родителя?


Нет ничего нового под солнцем sm.gif - практически все механизмы взаимодействия объектов уже открыты и где-то используются. Общение дочерних объектов с родительскими широко применяется в библиотеках классов GUI, например, таких как MFC или VCL.

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

А для большего удобства в этом же супербазовом классе (superbase) лучше сразу создать переменную (указатель), в которой каждый объект будет помнить указатель на своего родителя (естественно, приведенного к типу superbase*). Например, классу superbase достаточно выглядеть так:

class superbase
{
Piblic:
superbase *myParent;
superbase(superbase *parent) { myParent = parent; }
};

В принципе родительские и дочерние объекты могут быть совершенно разными по своим структурам классами, их переписывать не надо, а достаточно ОБЪЕДИНИТЬ с классом superbase! Скажем были раньше у вас три класса Object1, Object2 и Object3, на основе которых вы порождали состоящие в родстве объекты: бабушку, мать и дочь. А теперь создайте для них новую тройку объектов:

class Family1 : public superbase, public Object1 // это для бабушки
{
Family1(superbase *parent, ...) : superbase(parent), Object1(...) { ... }
};

class Family2 : public superbase, public Object2 // это для матери
{
Family2(superbase *parent, ...) : superbase(parent), Object2(...) { ... }
};

class Family3 : public superbase, public Object3 // это для дочери
{
Family3(superbase *parent, ...) : superbase(parent), Object3(...) { ... }
};

Мы видим, что новые семейные классы (Family1, Family2, Family3) функционально тождественны старым индивидуальным классам (Object1, Object2 и Object3) соответственно. А троеточием я обозначила список тех параметров, которыми инициируются старые классы. Фактически, семейные классы отличаются от старых только одним - дополнительным параметром parent и способностью его запоминать в своей переменной myParent.

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

new Family3 child1( this, ...);

Теперь дитя child1 всегда будет помнить свою маму в child1.myParent. Ну а самый старый патриарх, которого порождает уже не семья, а само приложение, инициируется с парамером NULL вместо указателя на parent. В смысле, что родителя у него среди семьи нет.

Весь смак в том, что теперь любой потомок будет способным не только узнать адрес своего родителя по myParent, но и обратиться к нему (вызвать по этому поинтеру какую-нибудь родительскую функцию). А если возникнут затруднения с доступом, то поинтер myParent всегда можно привести к полному указателю на родительский класс динамически.

Точно так же можно достучаться до предка в любом поколении через цепочку myParent->myParent->...->myParent. И если на каком-то этапе очередной myParent окажется равным NULL, то это родоначальник династии, и глубже опускаться по генеалогическому древу не надо. Например, послание собственной бабушке будет выглядеть так:

myParent->myParent->Message = "Здравствуй, бабуля!";

А послание прадедушке так:

myParent->myParent->myParent->Message = "Привет, прадед!";

Если последнее поколение - помидор, а предок всего сущего - admin, то жалобу ему помидор может оправить, либо вызвав myParent от myParent столько раз, каким по счету поколением от него является помидор. А если он точно этого не знает, то легко может узнать, проследив эту цепочку до нуля:

superbase *Admin = myParent;
while(Admin->myParent != NULL) Admin = Admin->myParent; // спускаем админа вглубь, пока не достигнем сироты
Admin->Message = "Караул! Загниваю!";
sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Idle   си, паттерны ооп, разбиение на объекты, parent's parent   Aug 15 2012, 18:57
- - ig_z   QUOTE (Idle @ Aug 15 2012, 21:57) помидор...   Aug 15 2012, 19:54
|- - Idle   Цитата(ig_z @ Aug 15 2012, 23:54) Если ре...   Aug 15 2012, 20:17
|- - Lotor   Цитата(Idle @ Aug 16 2012, 00:17) поясню ...   Aug 16 2012, 05:03
|- - _Pasha   Цитата(Lotor @ Aug 16 2012, 08:03) Callba...   Aug 16 2012, 06:20
|- - Idle   Цитата(_Pasha @ Aug 16 2012, 10:20) Долго...   Aug 16 2012, 06:35
|- - AHTOXA   Цитата(_Pasha @ Aug 16 2012, 12:20) Помид...   Aug 16 2012, 07:32
|- - _Pasha   Цитата(AHTOXA @ Aug 16 2012, 10:32) Во-пе...   Aug 16 2012, 07:38
- - Cosmojam   А если callback-и сохранять указателем в каком-то ...   Aug 16 2012, 07:23
- - Idle   эволюция примерно такая, сначала всё изолированно ...   Aug 16 2012, 08:22
- - _Pasha   Дык... томат говорит "уберите меня!!...   Aug 16 2012, 08:57
|- - Idle   Цитата(_Pasha @ Aug 16 2012, 12:57) Тот, ...   Aug 16 2012, 09:56
|- - ARV   Цитата(Idle @ Aug 16 2012, 13:56) это всё...   Aug 16 2012, 10:03
- - SSerge   Цитата(Idle @ Aug 16 2012, 01:57) не испо...   Aug 16 2012, 09:29
- - ARV   имхо, все с ног на голову! яйцо курице ничего ...   Aug 16 2012, 09:47
- - Idle   да, у меня есть текcтовое описание того, какие ест...   Aug 16 2012, 10:15
|- - AlexandrY   Цитата(Idle @ Aug 16 2012, 13:15) да, у м...   Aug 16 2012, 10:54
|- - _Pasha   Цитата(Xenia @ Aug 16 2012, 13:49) наприм...   Aug 16 2012, 11:29
|- - Idle   Цитата(_Pasha @ Aug 16 2012, 15:29) У Вас...   Aug 16 2012, 11:41
- - kolobok0   Цитата(Idle @ Aug 15 2012, 22:57) ...как ...   Aug 16 2012, 14:33
|- - Idle   Цитата(kolobok0 @ Aug 16 2012, 18:33) И в...   Aug 16 2012, 15:02
|- - kolobok0   Цитата(Idle @ Aug 16 2012, 18:56) ...есть...   Aug 16 2012, 15:11
- - _Pasha   Хорошая мысль, кстати. Про дисциплину инженерной и...   Aug 16 2012, 14:46
- - Idle   Цитата(Xenia @ Aug 16 2012, 14:49) Для то...   Aug 16 2012, 18:26
|- - _Pasha   Цитата(Idle @ Aug 16 2012, 21:26) посмотр...   Aug 17 2012, 04:28
|- - ReAl   Цитата(_Pasha @ Aug 17 2012, 07:28) ЗЫ то...   Aug 17 2012, 06:39
- - andrewlekar   Хотите сделать хорошо - делайте проще. Заведите сп...   Aug 17 2012, 04:57
- - andrewlekar   ЦитатаЕсли они помидоры. А если банки с помидорами...   Aug 17 2012, 09:04
|- - Idle   Цитата(andrewlekar @ Aug 17 2012, 13:04) ...   Aug 17 2012, 09:48
- - andrewlekar   Цитатауказатель на конкретного менеджера изначальн...   Aug 17 2012, 09:56
|- - Idle   Цитата(andrewlekar @ Aug 17 2012, 13:56) ...   Aug 17 2012, 10:06
- - ARV   сначала программисты "из удобства" созда...   Aug 17 2012, 10:51
|- - Idle   Цитата(ARV @ Aug 17 2012, 14:49) ок, дал...   Aug 17 2012, 10:53
|- - kolobok0   Цитата(ARV @ Aug 17 2012, 14:51) ...в рез...   Aug 17 2012, 11:20
- - andrewlekar   Как делать best надо спрашивать того, кто эту архи...   Aug 17 2012, 11:19
|- - Idle   Цитата(andrewlekar @ Aug 17 2012, 15:19) ...   Aug 17 2012, 11:33
- - andrewlekar   ОО сущности от клиента - это всегда пассивные объе...   Aug 17 2012, 11:24
|- - kolobok0   Цитата(andrewlekar @ Aug 17 2012, 15:24) ...   Aug 17 2012, 13:51
|- - Idle   Цитата(kolobok0 @ Aug 17 2012, 17:51) и с...   Aug 17 2012, 14:35
||- - ARV   Цитата(Idle @ Aug 17 2012, 18:35) и что д...   Aug 17 2012, 14:59
||- - Idle   Цитата(ARV @ Aug 17 2012, 18:59) а если с...   Aug 17 2012, 15:07
|- - _Pasha   Цитата(kolobok0 @ Aug 17 2012, 16:51) вам...   Aug 17 2012, 15:43
|- - ARV   Цитата(_Pasha @ Aug 17 2012, 19:43) Это п...   Aug 17 2012, 16:44
- - ARV   все, что я хотел, я _вам_ сказал, добавить могу то...   Aug 17 2012, 15:34
|- - Idle   Цитата(ARV @ Aug 17 2012, 19:34) добавить...   Aug 17 2012, 16:58
|- - kolobok0   Цитата(Idle @ Aug 17 2012, 20:58) ...всё ...   Aug 17 2012, 19:18
|- - Idle   Цитата(kolobok0 @ Aug 17 2012, 23:18) Вы ...   Aug 17 2012, 19:44
|- - _Pasha   Цитата(Idle @ Aug 17 2012, 22:44) я пришё...   Aug 17 2012, 19:55
|- - Idle   Цитата(_Pasha @ Aug 17 2012, 23:55) Аминь...   Aug 17 2012, 20:21
- - редактор   В отпуске пропустил дискуссию, но выскажусь Цитата...   Aug 20 2012, 06:30
|- - ARV   Цитата(редактор @ Aug 20 2012, 10:30) И ч...   Aug 20 2012, 06:48
|- - Idle   Цитата(редактор @ Aug 20 2012, 10:30) И ч...   Aug 20 2012, 08:55
|- - ARV   Цитата(Idle @ Aug 20 2012, 12:55) так и д...   Aug 20 2012, 11:47
|- - Idle   Цитата(ARV @ Aug 20 2012, 15:47) то есть ...   Aug 20 2012, 19:25
- - _Pasha   Ба! Да у Вас (ТС) - налицо извечные проблемы в...   Aug 20 2012, 12:20
- - Idle   Цитата(_Pasha @ Aug 20 2012, 16:20) Ба...   Aug 20 2012, 14:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01448 секунд с 7
ELECTRONIX ©2004-2016