...当该类确实为所有抽象方法提供实现,但不是“正式”实现该接口(interface)时?
可以说我有以下几点:
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;
}
这很好用,但是我想知道是否可以节省一些文字,或者是否有更好的方法来处理这种情况。
最佳答案
我会使用与您上一个代码段非常相似的方法
class MyABClass : public AInterface {
public:
void MyABClass(BClass &_a)
: a(_a)
{}
void mem_func(){a.mem_func();}
private:
BClass &a;
}
这是一种设计模式,称为Adapter(带有委派)。也许您还想阅读有关Proxy模式的信息。
更新(考虑肯尼的评论):是否通过
BClass
作为引用或副本是有争议的。这取决于您想要什么。如果您希望使用包装器方便地更改原始BClass
实例,则可以使用BClass &
作为构造函数参数。另一方面,如果副本足够,则仅使用BClass
而不使用&符号&
。好吧,如果有副本构造函数可用。最后,在使用可能会产生副作用的引用文献时,您必须要注意(可能还是不希望出现的)。