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:底线
首先是您指定一组“基线”坐标.首先转换为转换为核心集,然后从中转换.
优点:您只需要为任意数量的不同DataProcessor编写toBaseline和fromBaseline.添加新的DataProcessor就像创建它一样简单,然后在核心集中写入转换.
缺点:在大多数情况下,在进行两次转换时,性能会受到影响.由于代表或转换的损失,准确性可能会受到影响.
变形金刚对象
创建一个将对象从DataProcessor转换为DataProcessor的接口.
为每个受支持的转换创建该接口的实例.
有一个实用程序类,它具有源和目标对的映射到要使用的正确转换.在该实用程序类上调用方法以按需执行转换.
优点:不必浪费多次转换.
缺点:n ^ 2转换对象需要创建,其中n是不同DataProcessor对象的数量.创建新的DataProcessor时,您需要为添加的每个DataProcessor编写和添加transform对象.将在运行时检测缺失转换而不是编译时间.
总结以上是内存溢出为你收集整理的c – 派生类依赖函数全部内容,希望文章能够帮你解决c – 派生类依赖函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)