假设我有以下类层次结构:
class A
{
public:
virtual ~A();
};
class B : public A
{};
class AUser
{
public:
virtual ~AUser();
protected:
A* m_pA;
};
class BUser : public AUser
{};
现在我想向B
添加一个方法,该方法与A
无关,只会从BUser
调用。
class B : public A
{
public:
void addedFunctionality()
{
// do something
}
};
要调用添加的方法,我有两个选择:
将空方法添加到A:
class A
{
public:
virtual ~A();
void addedFunctionality()
{
// do nothing
}
};
class BUser : public AUser
{
void useB()
{
m_pA->addedFunctionality();
}
};
使用向下转换调用添加的方法:
class BUser : public AUser
{
void useB()
{
static_cast<B*>(m_pA)->addedFunctionality();
}
};
我知道应该避免向下倾斜,但我不喜欢第一个选项,因为它毫无理由地膨胀了A
的代码。
还有其他设计选择吗?
答案 0 :(得分:0)
最简单的解决方案如下所示(也由Ulrich Eckhardt建议):
class AUser
{
public:
AUser(A* a)
{
m_pA = a;
}
protected:
A* m_pA;
};
class BUser : public AUser
{
public:
BUser(B* b) : AUser(b)
{
m_pB = b;
}
void useB()
{
m_pB->addedFunctionality();
}
protected:
B* m_pB;
};
不太干净,但你也可以考虑这个:
class BUser : public AUser
{
public:
BUser(B* b) : AUser(b)
{
}
void useB()
{
getB()->addedFunctionality();
}
protected:
B *getB()
{
return dynamic_cast<B*>(m_pA);
}
};