注意:我在(不太可能)的情况下标记了设计模式。如果不是,我将删除标签。
考虑这个例子:
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 ++中的这个问题?
答案 0 :(得分:1)
这个OOP问题有名字吗?
是的,它被称为Mixin Pattern。
您一直使用的相关模式是Template Method Pattern。
这个例子是在C ++中解决这个问题的好方法吗?
取决于情况和用例。但是这种风格本身并不坏,并且在许多API中使用。微软的ATL就是一个例子。
有没有更好/更清晰的方法来解决C ++中的这个问题?
再次取决于您的使用案例。提供多种接口实现的方法不止一种。