| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Повторное использования кода |
| Автор: VictorOff 19.1.2012, 12:01 | ||||||||
| Уважаемые знатоки! Требуется ваш совет в области повторного использования кода. Имеется класс небинарного дерева и класс его узлов. (Пусть будет TBaseTree и TBaseTreeNode) Там реализован весь функционал относящийся к деревьям (построение, поиск, и т.д.) Теперь у меня есть класс с дополнительным функционалом (пусть будет TMyTree и TMyTreeNode). Как быть? Если я унаследую его от TBaseTree, то все его функции типа Childs, Find и т.д. возвращают TBaseTreeNode.
и мне придется всюду использовать приведение к TMyTreeNode, что неудобно. Перебрав различные варианты (в том числе и субклассирование) я остановился на следующем: В качестве базового класса использую шаблонный класс
а параметр T использую для получения значений в функциях типа Childs
TMyTreeNode наследую от TBaseTreeNode с передачей в параметр своего класса
Выбранный вариант устраивал до тех пор, пока не понадобился интерфейс класса TBaseTree. (это надо чтоб в определенном модуле программы объявить переменную с типом абстрактного интерфейса IBaseTree, а передавать в него объекты различных вариантов реализации TMyTreeNode1, TMyTreeNode2…) При работе с параметризированным классом TBaseTree это невозможно. Был бы очень благодарен, если кто-нибудь поделился дельным советом. |
| Автор: VictorOff 19.1.2012, 14:37 | ||||||||
А можно поконкретнее? Ранее у меня было
хотелось бы иметь возможность что-то вроде
но как реализовать данный вариант? Это не работает.
Следовательно, использование параметризированного класса TBaseNode не лучший вариант, если требуется работа с интерфейсом и необходима к.л. другая конструкция? |
| Автор: xvr 19.1.2012, 17:36 | ||
Именно так. Почему не работает? В смысле не дает перегрузить FirstChild() ? Сделайте так:
|
| Автор: VictorOff 20.1.2012, 08:24 | ||||||
Просто хотелось как-то поизящнее, если уж так, то можно сразу обойтись без шаблона
Немного не коробит, что при вызове через интерфейс необходимо использовать одно наименование метода, а в TMyNode другое? |
| Автор: xvr 20.1.2012, 12:07 | ||||
Так вам придется определять FirstChild в каждом конечном наследнике.
Увы, ваш IBaseNode слишком generic, что бы в нем можно было найти общий базовый класс для возврата из FirstChild(). У вас фактически каждый TBaseNode<> реализует свое дерево (по типу аргумента шаблона). И на уровне самого шаблона TBaseNode нет никакой связи между типом T и IBaseNode |
| Автор: VictorOff 20.1.2012, 13:01 |
| xvr, согласен, вы правы, спасибо. |