Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 如何重构具有类似功能的两个类?_C++11_Design Patterns - Fatal编程技术网

C++11 如何重构具有类似功能的两个类?

C++11 如何重构具有类似功能的两个类?,c++11,design-patterns,C++11,Design Patterns,我有一些具有相同名称的方法的类,它们做相同的事情,但它们的实现方式不同 例: 我考虑过使用接口,但问题是这些方法采用不同的参数。但是模板也不完全适合,因为Item1和Item2的操作方式不同。换句话说,它们没有通用的方法,所以模板也不完全适合 这里有重构代码的解决方案吗?我在考虑使用模板专门化,但是如果它们都使用完全不同的方法,那就不值得了,尽管这样会更具可读性。给出您的评论“如何…拥有一个可扩展的接口样式类”,您可能有兴趣使用模板来表达常见的“接口”: 模板 结构转换器 { 虚空图(项目)=0

我有一些具有相同名称的方法的类,它们做相同的事情,但它们的实现方式不同

例:

我考虑过使用接口,但问题是这些方法采用不同的参数。但是模板也不完全适合,因为Item1和Item2的操作方式不同。换句话说,它们没有通用的方法,所以模板也不完全适合


这里有重构代码的解决方案吗?

我在考虑使用模板专门化,但是如果它们都使用完全不同的方法,那就不值得了,尽管这样会更具可读性。

给出您的评论“如何…拥有一个可扩展的接口样式类”,您可能有兴趣使用模板来表达常见的“接口”:

模板
结构转换器
{
虚空图(项目)=0;
虚空转换(项)=0;
虚空转换(项)=0;
};
类converterA:公共转换器{
无效映射(Item1 Item1)最终{…}
无效转换(项1项)最终{…}
无效翻译(项1项)最终{…}
};
类转换器B:公共转换器{
…同样的事情。。。
};

不过,它给您带来的只是它们共享的“Converter”接口的一个表达式,一些编译时强制执行,使函数签名和名称与之匹配(例如,如果您更改
Converter
,则会提醒您更新所有派生类型),以及使用指向派生类的模板实例化的指针/引用来处理派生类的能力(这对您来说没有任何表面上的用途).

在这种情况下,通过重构您想获得什么?我只是想知道是否有一种方法可以压缩代码,或者有一个接口样式的类可以扩展,因为这两个类具有相似的功能。
class converterA {
    map(Item1 item1) {
        // Implementation details.
    }

    convert(Item1 item1) {
        // Implementation details.
    }

    translate(Item1 item1) {
        // Implementation details.
    }
}

class converterB {
    map(Item2 item2) {
    // Implementation details.
    }

    convert(Item2 item2) {
    // Implementation details.
    }

    translate(Item2 item2) {
    // Implementation details.
    }
}
template <typename Item>
struct Converter
{
    virtual void map(Item) = 0;
    virtual void convert(Item) = 0;
    virtual void translate(Item) = 0;
};

class converterA : public Converter<Item1> {
    void map(Item1 item1) final { ... }
    void convert(Item1 item) final { ... }
    void translate(Item1 item) final { ... }
};
class converterB : public Converter<Item2> {
    ...same kind of thing...
};