C++ 如何调用类与其基类之间的接口?
注意:我标记了设计模式,只是(不太可能)它实际上是一种模式。如果不是,我就把标签去掉 考虑这个例子:C++ 如何调用类与其基类之间的接口?,c++,oop,design-patterns,C++,Oop,Design Patterns,注意:我标记了设计模式,只是(不太可能)它实际上是一种模式。如果不是,我就把标签去掉 考虑这个例子: template <class _base> struct SplitPrint: public _base { virtual void printPositive(int positive) = 0; virtual void printNegative(int negative) = 0; void print( int number) override
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
}
模板
struct SplitPrint:public\u base
{
虚空打印正(整数正)=0;
虚空打印负数(整数负数)=0;
无效打印(整数)覆盖
{
_基::打印(数字);
如果(数字>=0)
打印阳性(数字);
其他的
打印负片(数字);
}
};
结构接口
{
虚空打印(整数)=0;
};
//实现接口
结构NormalImplementer:公共接口
{
无效打印(整数)覆盖{std::cout
这个OOP问题有名字吗
是的,它叫
您也一直在使用的一个相关模式是
这个例子是解决C++中的问题的好方法吗?
取决于具体情况和用例。但这种风格本身并不坏,在许多API中都有使用。微软的ATL就是一个例子
< C++ > 有更好的/更清洁的方法来解决这个问题吗?
同样取决于您的用例。提供多个接口实现的方法不止一种。这个问题可能属于@DanielT。它是基于我遇到的一个实际问题,所以默认情况下我没有认真考虑就发布了,但现在我再次阅读了我的问题,您可能是对的,可能是crosspos这个问题问到一个特定的C++编程问题,我认为它不需要迁移到SE软件工程。谢谢,这真的很有帮助。我会花一些时间来阅读OU提供的源。@ AlexandreTHOUVENIN,如果你能发现一些代码中使用的模式,这些都很容易找到;-)是的,但公平地说,我不喜欢。“我不知道超过3或4种设计模式,所以我通常会解决我的问题,然后继续前进。这一次,因为它看起来像一个一般的OOP问题,我想知道它是否已经有了(更好/类似的)解决方案。而且它有一个。称之为错误的顺序^”