...当该类确实为所有抽象方法提供实现,但是不是“正式”实现该接口时吗?
可以说我有以下几点:
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;
}
这是一种设计模式,称为适配器(带委托)。也许您还想阅读有关代理模式的信息。
更新(考虑肯尼的评论):是否BClass
作为参考或副本通过尚有待商bat。这取决于您想要什么。如果您希望使用包装器方便地更改原始BClass
实例,则可以将其BClass &
用作构造函数参数。另一方面,如果副本足够,则可以BClass
不使用&符使用&
。好吧,如果有副本构造函数可用。最后,在使用可能会产生副作用的参考文献时,您必须要注意(可能还是不希望出现的副作用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句