...当类实际上为所有抽象方法提供实现时,但不是"正式"实现界面?
假设我有以下内容:
class AInterface {
public:
virtual void mem_func()=0;
virtual ~AInterface(){}
};
void AFunction(AInterface* i){};
class BClass {
public:
void mem_func(){}
virtual ~BClass(){}
};
我无法更改任何此类但我想使用类BClass的对象来调用AFunction。
实际上,我想写一些类似
的内容class MyABClass : public BClass,public AInterface {};
但这没有帮助(该类只是继承了这两种方法并且是抽象的)。我想有一种方法可以写出像
这样的东西class MyABClass : public AInterface {
public:
void mem_func(){a.mem_func();}
private:
BClass a;
}
这样做很好,但我想知道是否可以保存一些写作或是否有更好的方法来处理这种情况。
答案 0 :(得分:2)
我会使用与您上一个代码段非常相似的方法
class MyABClass : public AInterface {
public:
void MyABClass(BClass &_a)
: a(_a)
{}
void mem_func(){a.mem_func();}
private:
BClass &a;
}
这是一种设计模式,称为Adapter(带委托)。也许您还想了解Proxy模式。
更新(考虑Kenny的评论):您是否将BClass
作为参考或副本传递是有争议的。这取决于你想要什么。如果您想要一个包装器来方便地更改原始BClass
实例,那么使用BClass &
作为构造函数参数。另一方面,如果副本足够,则只使用BClass
而不使用&符号&
。那么,如果一个拷贝构造函数可用。最后,在使用可能会产生副作用的参考时,你必须要注意(这可能是需要与否)。
答案 1 :(得分:0)
你的第一次尝试几乎是正确的
class MyClass : public AClass,public AInterface {};
问题是MyClass不知道AClass :: A()满足AInterface :: A()= 0提出的要求。给它一点帮助
class MyClass : public AClass, public AInterface {
void A() {AClass::A();}
};