Как мы все знаем, C ++ допускает множественное наследование.
Context
Я реализую сеть обработки, в которой некоторые узлы обработки являются связующим звеном между собой для обмена различными данными с помощью своего рода измененного шаблона Observer.
Узлом, который может отправлять определенный тип данных, является «DataSender», который затем расширяет этот абстрактный класс.
Узел, который может принимать данные определенного типа, является «DataReceiver», а затем расширяет этот абстрактный класс.
Вот мой код:
DataReceiver.h
template <typename TReceivedData>
class DataReceiver {
public:
void receiveData(TReceivedData* receivedData)
{
m_receivedData = receivedData;
}
TReceivedData* getReceivedData()
{
return(m_receivedData);
}
private:
TReceivedData* m_receivedData;
DataSender.h
template <typename TSentData>
class DataSender {
public:
void sendData(TSentData* sentData)
{
set<DataReceiver<TSentData>*>::const_iterator it;
for(it = m_receiverList.begin(); it != m_receiverList.end(); ++it)
(*it)->receiveData(sentData);
}
void addDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.insert(dataReceiver);
}
void removeDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.erase(dataReceiver);
}
private:
set<DataReceiver<TSentData>*> m_receiverList;
};
Затем новый узел просто реализуется путем расширения одного или обоих этих абстрактных классов.
Вопрос
Мне нужен узел, который отправляет данные типа «Изображение» и «Текст»: тогда у меня есть узел:
с:
class Node : public DataSender<Image>, DataSender<Text>
Ну, я думаю, вы уже видели мою проблему, компиляция этого не допустит, так как если я запустлю, возникает двусмысленность:
Node* node;
node->sendData(<my argument>);
потому что он не может отличить, какой sendData () от родительских классов (от наследования) должен использоваться (это распространенная проблема множественного наследования).
1) Есть ли способ использовать sendData () с чем-то для устранения неоднозначности (я не уверен, что она есть?
2) Есть ли другой способ решить мою проблему общения? (Я абсолютно хочу иметь возможность, что конечный пользователь, который хочет создать узел, который отправляет / получает данные, может легко сделать это, просто расширив что-то вроде интерфейса, и данные должны быть на разных «каналах»: например, узел может сможет обрабатывать текст и изображение, но отправит только изображение ...
Спасибо за помощь,
Julien