我经常使用桥梁设计模式。但是我对如何在继承对象中有效地使用它感到困惑。使用struct apple::impl:public fruit会产生双对象水果。我想在实现
中使用抽象基类数据成员class fruit
{
public:
virtual void print() = 0;
private:
int count_;
};
class apple: public fruit
{
public:
virtual void print();
private:
int apple_count_;
struct impl;
std::unique_ptr<impl> impl_;
};
struct apple::impl
{
virtual void print() { cout << "apple"; }
};
void apple::print(){ impl_->print(); }
桥接模式的重点是将接口与实现分开。数据成员是实现的一部分,因此它们不属于接口类或其任何超类。
如果你想要可继承的实现组件,比如你的数据成员,那么在更高的层次上执行接口/实现分离——例如,创建一个fruit::impl
来保存成员,并让apple::impl
继承它。还要注意,实现端的类不需要继承接口端的任何类,如果不这样做,设计会更清晰、更简洁。