Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с иерархией классов.

991
19 мая 2005 года
Zenhipster
157 / / 14.01.2005
Недавно, при разработке проэкта на С++ столкнулся с проблемами, касающимися выбора иерархии классов.
Проэкт представляет из себя трехмерную реализацию пользовательского интерфейса, и состаит из двух частей.
Первая - простенький движок, для работы с иерархическими структурами 3D объектов, вторая - собственно GUI.

Код:
I.  Фрагмент иерархии классов движка:
                     tObject
                        |
                tArbitraryTreeNode
                        |
                tArbitraryTreeDNode
                        |
                    t3DObject
                     |     |
            tPolyhedron  t3DSprite

------------------------------------------------------------------------------
II. Фрагмент иерархии классов GUI:
                             |
 +-----------------------t3DObject---------------------------+
 |                           |                               |
 |                       tPolyhedron                     t3DSprite
-+---------------------------+-------------------------------+----------------
 |                           |                               |
 |                           |                               |
 | tdxGUI_BaseComponent      |                               |
 |           |       |       +-------------------+           |
tdxGUI_FakeComponent |                           |           +---+
                     |                           |               |
                    tdxGUI_Component--tPolyhedronBasedComponent  |
                             |                                   |
                    t3DSpriteBasedComponent----------------------+

//////////////////////////////////////////////////////////////////////////////


Имеется указатель на tdxGUI_BaseComponent. От него можно получить доступ к нужному потомку
(в tdxGUI_Component описаны основные виртуальные методы OnMouseMove(), и.т.п. ).

На случай, если через такой указатель надо получить доступ к методам объявленным в
t3DObject, - в tdxGUI_BaseComponent обявлен виртуальный метод:

virtual t3DObject *As3DObject(void) = 0;

А в tdxGUI_FakeComponent, tPolyhedronBasedComponent, и t3DSpriteBasedComponent
- его реализация:
t3DObject *tdxGUI_PolyhedronBasedComponent::As3DObject(void)
{return this;};

Но когда доходит дело до обхода дерева, то очередной потомок узла имеет тип
(tArbitraryTreeNode*), и преобразовать его к типу (tdxGUI_BaseComponent*) не представляется
возможным. Максимум что можно сделать, - это преобразовать его к типу t3DObject.

Можно конечно в t3DObject обявить виртуальный метод
virtual tdxGUI_BaseComponent *AsBaseComponent(void) = 0;
, а в tdxGUI_BaseComponent - реализовать его, но это плохой способ, т.к. движок и GUI, явля-
ются двумя разными модулями (dll), и делать движок зависимым от GUI нехочется.


Кто нибудь знает как тут быть? - А то я себе уже все мозги разбил на части...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог