I. Фрагмент иерархии классов движка:
tObject
|
tArbitraryTreeNode
|
tArbitraryTreeDNode
|
t3DObject
| |
tPolyhedron t3DSprite
------------------------------------------------------------------------------
II. Фрагмент иерархии классов GUI:
|
+-----------------------t3DObject---------------------------+
| | |
| tPolyhedron t3DSprite
-+---------------------------+-------------------------------+----------------
| | |
| | |
| tdxGUI_BaseComponent | |
| | | +-------------------+ |
tdxGUI_FakeComponent | | +---+
| | |
tdxGUI_Component--tPolyhedronBasedComponent |
| |
t3DSpriteBasedComponent----------------------+
//////////////////////////////////////////////////////////////////////////////
Проблема с иерархией классов.
Проэкт представляет из себя трехмерную реализацию пользовательского интерфейса, и состаит из двух частей.
Первая - простенький движок, для работы с иерархическими структурами 3D объектов, вторая - собственно GUI.
Код:
Имеется указатель на 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 нехочется.
Кто нибудь знает как тут быть? - А то я себе уже все мозги разбил на части...