繁体   English   中英

您如何称呼位于类及其基类之间的接口?

[英]How do you call an interface standing between a class and its base class?

注意:我只是在(不太可能)的情况下标记了设计模式,实际上它是一个。 如果不是,我将删除标签。

考虑以下示例:

template <class _base>
struct SplitPrint: public _base
{
    virtual void printPositive(int positive) = 0;
    virtual void printNegative(int negative) = 0;
    void print( int number) override
    { 
        _base::print(number);
        if (number >= 0)
            printPositive(number);
        else
            printNegative(number);
    }
};

struct Interface
{
    virtual void print( int number) = 0;
};

//implements the interface
struct NormalImplementer : public Interface
{
    void print( int number) override { std::cout << number << "\n"; }
};

//Still implements the interface
struct DifferentImplementer : public SplitPrint<NormalImplementer>
{
    void printPositive (int number) override { if (number > 10) std::cout << "big" << "\n"; }
    void printNegative (int number) override { if (number < -10) std::cout << "small" << "\n"; }
};

//Still implements the interface
struct TellSign : public SplitPrint<DifferentImplementer>
{
    void printPositive (int number) override { std::cout << "also, positive" << "\n"; }
    void printNegative (int number) override { std::cout << "also, negative" << "\n"; }
};


int main()
{
  NormalImplementer printer1;
  DifferentImplementer printer2;
  TellSign printer3;

  printer1.print(5); //5
  printer1.print(-42); //-42

  printer2.print(5); //5
  printer2.print(-42); //-42 small

  printer3.print(5); //5 also, positive
  printer3.print(-42); //-42 small also, negative
}

在这里,我将纯虚拟方法“ print”分为另外两种方法,DifferentImplementer不必知道如何打印数字(愚蠢的示例,但希望您理解我的意思),只要它知道如何打印正数即可;如何打印负片。

这个OOP问题有名字吗? 此示例是解决C ++中此问题的好方法吗? 有没有更好/更干净的方法来解决C ++中的此问题?

这个OOP问题有名字吗?

是的,它称为Mixin Pattern

您一直在使用的一个相关模式是模板方法模式

此示例是解决C ++中此问题的好方法吗?

取决于情况和用例。 但是这种样式并不是天生就不好,并且可以在许多API中使用。 微软的ATL就是一个例子。

有没有更好/更干净的方法来解决C ++中的此问题?

再次取决于您的用例。 提供多种接口实现的方法不止一种。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM