![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| VictorOff |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Уважаемые знатоки!
Требуется ваш совет в области повторного использования кода. Имеется класс небинарного дерева и класс его узлов. (Пусть будет TBaseTree и TBaseTreeNode) Там реализован весь функционал относящийся к деревьям (построение, поиск, и т.д.) Теперь у меня есть класс с дополнительным функционалом (пусть будет TMyTree и TMyTreeNode). Как быть? Если я унаследую его от TBaseTree, то все его функции типа Childs, Find и т.д. возвращают TBaseTreeNode.
и мне придется всюду использовать приведение к TMyTreeNode, что неудобно. Перебрав различные варианты (в том числе и субклассирование) я остановился на следующем: В качестве базового класса использую шаблонный класс
а параметр T использую для получения значений в функциях типа Childs
TMyTreeNode наследую от TBaseTreeNode с передачей в параметр своего класса
Выбранный вариант устраивал до тех пор, пока не понадобился интерфейс класса TBaseTree. (это надо чтоб в определенном модуле программы объявить переменную с типом абстрактного интерфейса IBaseTree, а передавать в него объекты различных вариантов реализации TMyTreeNode1, TMyTreeNode2…) При работе с параметризированным классом TBaseTree это невозможно. Был бы очень благодарен, если кто-нибудь поделился дельным советом. |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А как вы потом разберетесь какая именно реализация к вам пришла?
Делаете интерфейс IBaseTree, и наследуете шаблонный класс TBaseTree от него. Таким образом IBaseTree (не шаблонный) станет родителем всех шаблонных производных от TBaseTree (что вам собственно и надо) |
|||
|
||||
| VictorOff |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
А можно поконкретнее? Ранее у меня было
хотелось бы иметь возможность что-то вроде
но как реализовать данный вариант? Это не работает.
Следовательно, использование параметризированного класса TBaseNode не лучший вариант, если требуется работа с интерфейсом и необходима к.л. другая конструкция? |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Именно так. Почему не работает? В смысле не дает перегрузить FirstChild() ? Сделайте так:
|
|||
|
||||
| VictorOff |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Просто хотелось как-то поизящнее, если уж так, то можно сразу обойтись без шаблона
Немного не коробит, что при вызове через интерфейс необходимо использовать одно наименование метода, а в TMyNode другое? |
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Так вам придется определять FirstChild в каждом конечном наследнике.
Увы, ваш IBaseNode слишком generic, что бы в нем можно было найти общий базовый класс для возврата из FirstChild(). У вас фактически каждый TBaseNode<> реализует свое дерево (по типу аргумента шаблона). И на уровне самого шаблона TBaseNode нет никакой связи между типом T и IBaseNode |
||||
|
|||||
| VictorOff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
xvr, согласен, вы правы, спасибо.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |