【发布时间】:2015-07-07 18:19:54
【问题描述】:
我有基类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()怎么写,因为每个Catalog都用自己的数据来包含。是否应该模板化?
什么是解决方案?有没有我错过的编程模式?
【问题讨论】:
-
在网上搜索“double dispatch pattern c++”。
-
我理解错了吗:煮熟的不是多余的吗!?你只需要一个
DataProcessorInterface -
目录可以由其他人提供,DataProcessor 不仅可以放入数据,还可以在其中搜索。
标签: c++ class oop design-patterns