类 StructComponent 的构造函数根据传入的 info 对象的类型,采用不同的逻辑来初始化其成员变量。这里我使用强制转换将传入参数转换为正确的子类对象。
class StructComponent
{
public:
StructComponent(const ClassA& info)
{
if (info.getType() == CLASS_B)
{
const ClassC& classC = dynamic_cast<const ClassC&> info;
...
apply a different logic for ClassB and init member accordingly
} else if (info.getType() == CLASS_C) {
apply a different logic for others
...
} else {
apply default
}
}
}
class ClassA
{
public:
ClassA(...)
{
m_shp = CreateStructComponent();
}
virtual boost::shared_ptr<StructComponent> CreateStructComponent()
{
return boost::shared_ptr<StructComponent> (new StructComponent(*this));
}
...
int getType() const { return CLASS_A; }
protected:
boost::shared_ptr<StructComponent> m_shp;
}
class ClassB : public ClassA
{
public:
...
virtual boost::shared_ptr<StructComponent> CreateStructComponent()
{
return boost::shared_ptr<StructComponent> (new StructComponent(*this));
}
...
int getType() const { return CLASS_B; }
}
class ClassC : public ClassA
{
public:
...
virtual boost::shared_ptr<StructComponent> CreateStructComponent()
{
return boost::shared_ptr<StructComponent> (new StructComponent(*this));
}
...
int getType() const { return CLASS_C; }
}
Q1> 代码是否正确忽略了潜在的设计问题?
Q2>假设ClassA的所有子类都有相同的函数CreateStructComponent的实现体。有没有一种方法可以节省空间而不是重复执行以下相同的代码:
return boost::shared_ptr<StructComponent> (new StructComponent(*this));
Q3> 有没有更好的设计可以使用?例如,有没有一种方法可以忽略 StructComponent 中的强制转换?