是否有一种设计模式可以在不使用动态转换的情况下实现运行时多态性



假设我有一个类结构,其中父类p存储指向类C的子对象的指针向量

class P {
public:
P() {}
private:
std:: vector<C*> children;
};

此外,子类C是基类,DE是C的派生类。
D和E有一些唯一的成员变量。

class C
{
public:
C() {}
virtual ~C() {}
virtual void initialize() = 0;
};
class D : public C {
public:
void initialize() override;
//Member variable unique to D
int value;
};
class E: public C {
public:
void initialize() override;
//Member variable unique to E
std::vector<int> vector_value;
};

在运行时,C和D的对象被创建并添加到父p的子向量中。

稍后,我想迭代这个向量,确定对象类型并使用子对象的唯一成员变量。

我知道我可以通过使用动态投射来实现这一点:

for( C* child : children)
{
D* d_child = dynamic_cast<D*>(child);
if( d_child != nullptr)
{
// This object is of type D 
do something with  d_child->value ...
}
else
{
// This object is of type E
do something with  d_child->vector_value...
}
}

然而,当我们必须检查由许多答案迭代的类型时,这是一个糟糕的设计。检查派生类型(C++(

所以我想知道是否有一种标准的方式或设计模式可以帮助我以更好的方式实现这一功能?

您可以在基类中添加虚拟方法:

class C
{
public:
virtual ~C() {}
virtual void print() = 0;
virtual void initialize() = 0; // That one is strange,
// cannot you move initialization in constructor instead?
};
class D : public C {
public:
void initialize() override;
void print() override { std::cout << value; }
//Member variable unique to D
int value;
};
class E: public C {
public:
void initialize() override;
void print() override { for (auto value : vector_value) std::cout << value; }
//Member variable unique to E
std::vector<int> vector_value;
};

如果您开始向基类添加太多方法,那么Visitor模式可能会颠倒依赖关系。不过,它需要了解每个孩子的类型。

最新更新