У меня есть базовый класс DataProcessor
. Это базовый класс для калькуляторов положения в некоторой системе координат. Так, например, у него могут быть потомки вроде: SphericDataProcessor
, CartesianDataProcessor
. Существует базовый класс CookedDataCatalogue
, который является базовым классом для контейнеров с позиции некоторых объектов. Поэтому каждый DataProcessor
должен иметь возможность отправлять свои данные на все CookedDataCatalogue
. Я могу себе представить что-то вроде этого:Производная функция, зависящая от класса
class CookedDataCatalogue
{
virtual void Transform(DataProcessor* dp) = 0;
virtual void PutData(???) = 0;
}
class CookedDataCatalogue1 : public CookedDataCatalogue
{
void Transform(DataProcessor* dp) override
{
dp->TransformTo(this);
}
}
class CookedDataCatalogue2 : public CookedDataCatalogue
{
...
}
class CookedDataCatalogue3 ...
class DataProcessor
{
virtual void Process() = 0;
virtual void TransformTo(CookedDataCatalogue1* c) = 0;
virtual void TransformTo(CookedDataCatalogue2* c) = 0;
virtual void TransformTo(CookedDataCatalogue3* c) = 0;
}
Но мне это не нравится. Прежде всего void Transform(DataProcessor*)
мигрирует из базового класса всем детям **. Во-вторых, если я построю его как библиотеку, другой пользователь не сможет добавить свой собственный CookedDataUserCatalogue
, потому что он не может добавить еще void TransformTo(CookedDataUserCatalogue)
. В-третьих, я не знаю, как написать функцию PutData()
, потому что каждый каталог использует свои собственные данные для хранения. Должны ли они быть шаблонами?
Что такое решение? Есть ли какой-либо шаблон программирования, который я пропустил?
Поиск «двойной шаблон отправки C++» в Интернете. –
Я ошибаюсь: разве приготовленные лишние !? Вам нужно только «DataProcessorInterface» –
Каталоги могут быть предоставлены кем-то другим, и DataProcessor может не только помещать данные, но и искать в нем. – DoctorMoisha