派生的类相关函数
Derived class dependent function
我有基类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()
,因为每个Catalogue都使用自己的数据来包含。它应该被模板化吗?
什么是解决方案?有没有我错过的编程模式?
有两种方法可以做到这一点,还有评论中提到的双重调度模式:
基线
第一种方法是指定一组"基线"坐标。为了先转换到核心集,然后再从核心集转换。
优点:您只需要为任意数量的不同DataProcessor
s编写一个toBaseline
和fromBaseline
。添加一个新的DataProcessor
就像创建它,然后编写与核心集的转换一样简单。
缺点:在大多数情况下,当您进行两次转换时,性能会受到影响。准确性可能会因表示或转换方面的损失而受损。
变压器对象
创建一个将对象从DataProcessor
转换为DataProcessor
的接口。
为每个支持的转换创建该接口的实例。
拥有一个实用程序类,该类具有要使用的正确转换的源和目标对的映射。在该实用程序类上调用一个方法,以便根据需要执行转换。
优点:无需进行多次转换而造成浪费。
缺点:n^2个Transform
对象需要创建,其中n是不同DataProcessor
对象的数量。创建新的DataProcessor
时,需要为每个添加的DataProcessor
编写并添加Transform
对象。将在运行时而非编译时检测到缺少的Transform
。
- 为什么使用 "this" 指针调用派生成员函数?
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 在 C++ 中用派生类型重写成员函数
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如果基类包含双指针成员,则派生类的构造函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 在派生类中绑定非静态模板化成员函数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 覆盖虚拟函数 - 派生类具有不同的参数
- 正在调用基方法,而不是从构造函数派生方法
- 从具有相同虚拟函数的父函数派生时如何调用子函数
- 从派生类对象调用基类函数.派生类构造函数中设置的基类数据成员