加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 派生类依赖函数

发布时间:2020-12-16 07:11:52 所属栏目:百科 来源:网络整理
导读:我有基类DataProcessor.它是某些坐标系中位置计算器的基类.因此,例如,它可以有像SphericDataProcessor,CartesianDataProcessor这样的后代.有基类CookedDataCatalogue,它是某些对象位置的容器的基类.因此,每个DataProcessor都应该能够将其数据放到每个CookedD
我有基类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:

底线

首先是您指定一组“基线”坐标.首先转换为转换为核心集,然后从中转换.

优点:您只需要为任意数量的不同DataProcessor编写toBaseline和fromBaseline.添加新的DataProcessor就像创建它一样简单,然后在核心集中写入转换.

缺点:在大多数情况下,在进行两次转换时,性能会受到影响.由于代表或转换的损失,准确性可能会受到影响.

变形金刚对象

创建一个将对象从DataProcessor转换为DataProcessor的接口.

为每个受支持的转换创建该接口的实例.

有一个实用程序类,它具有源和目标对的映射到要使用的正确转换.在该实用程序类上调用方法以按需执行转换.

优点:不必浪费多次转换.

缺点:n ^ 2转换对象需要创建,其中n是不同DataProcessor对象的数量.创建新的DataProcessor时,您需要为添加的每个DataProcessor编写和添加Transform对象.将在运行时检测缺失转换而不是编译时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读