У меня проблема в моем дизайне.C++ интерфейс подключения к базовому классу
/// Generic class. Not owned by myself
class Node
{
add(Node* v) { /* do somthing */ }
};
/// interface writtern by myself
class ImyNode
{
add(ImyNode* v) = 0;
/// More functions
};
/// Implement ImyNode, use Node for implementation of SOME functions.
class myNode:
public ImyNode,
public Node
{
add(ImyNode* v) { Node::add(v); } // Error: ImyNode is not a type of Node
};
Ошибка, конечно, правильная. неудивительно. Но мне нужно решение. как решить эту ошибку компиляции.
У меня есть 4 предложения:
- Использование reinterpret_cast оператора в функции MyNode :: добавить()
- Создать intrface INode и пусть ImyNode продлить этот инод
- Изменить ImyNode :: добавить (ImyNode * v) в ImyNode :: добавить (MyNode * v)
- Пусть ImyNode простираться Сев.Узел
Все 4 предложения неприемлемы для меня. Зачем?
- Не сработает. некрасиво. Плохая идея
- Что делать, если я не владею узлом? что, если иерархия классов более сложна тогда?
- Интерфейс не должен знать ничего о его производных классах
- Не нравится, что интерфейс расширяет класс без интерфейса. Даже если я сделаю этот путь, как бы я назвал Node CTOR без ImyNode CTOR
Если у кого-то есть лучший дизайн или элегантное решение или может убедить меня, что одно из моих предложений хорошее, пожалуйста.
Спасибо.
Если класс ÌmyNode' является интерфейсом, почему бы не позволить 'Node' наследовать от этого и ваш' myNode' только наследовать от 'Node'? –
Узел - это общий класс, который обычно не принадлежит мне (давайте предположим на секунду, что я бы хотел избежать любых изменений в узле, поскольку он не является собственным и слишком общим. ImyNode имеет некоторые конкретные функции, которые не должны быть связаны с общим узлом (или должен знать) – idanshmu
Если вы хотите использовать Node, тогда класс myNode должен содержать «Node» (должен быть Is-a), а не наследовать от него. – Arun