我接到了一个库,实现在抽象类组成和继承设计问题
class A{
public :
virtual void foo() = 0 ;
};
class B{
public:
void setA(A * a) { m_a = a ;}
virtual void f() = 0;
void g() {m_a->foo();}
protected:
A * m_a ;
};
要使用你只需要派生类和实现纯虚函数库的形式的算法,这些虚拟课堂,如foo()
,并提供其他具体实施方法(bar()
)。
class dA : public A {
public :
void foo() {/* ... */}
void bar() {/* ... */}
};
class dB : public B {
public :
void f() ;
};
我通常会通过调用
dB * mydB = new dB() ;
mydB->setA(new dA());
mydB->f() ;
mydB->g() ;
使用这些类,但我有一个设计问题,实现dB::f()
的时候,因为我需要调用dA::bar()
,专用于dB
。但在课堂上,我只保留一个B *的参考。于是我想到了两个选项:
- 使用
dynamic_cast
每次f()
被称为投B::m_a
成dB*
- 添加m_dA成员分贝存储相同指针M_A,但可以用来访问dB特定功能。
当然,我不能改变基类。
我想知道是否有更优雅的解决方案来解决这个问题(就像我没有想到的设计模式)。如果不是,我应该选择哪一个?
如果'bar()'被调用了很多,我只想用你列出的第二个选项去。 – Praetorian
访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern)可能对您有用。用这种对问题的抽象描述很难给出具体的建议。 –
公共继承在这里可能不是正确的解决方案......'dB'对'B'中不存在的使用加以限制,因此'dB'的实例不能安全地视为'B '。 –