假设我有一堆存储类X1
,X2
,,, Xn
。
假设我有Writer
类,为每个存储类提供write()
个函数:
class Writer
{
public:
void write(const X1& x);
...
void write(const Xn& x);
};
现在我必须添加更多存储类,如下所示:
class B;
class D1: public B;
class D2: public B;
初始化如下:
B* d1 = new D1();
B* d2 = new D2();
现在我需要增强类Writer以包含以下函数:
void write(const B* b);
void write(const D1* d);
void write(const D2* d);
但这不符合我的意图。调用write(d1)
不会调用void write(const D1* d)
。我失去了以多态方式调用write()
的能力。
在我看来,这是visitor pattern的工作(如果我错了,请纠正我。我不是这种模式的经验,可能会弄错)。
无论visitor pattern
是否可行,是否有其他建议可以解决这个问题?
Writer
是一个复杂的类,它将存储类写入二进制文件。没有任何存储类需要知道它们被序列化到文件的方式。存储与写入过程分开。 dynamic_cast
是一个不经意的解决方案,但我想避免这种情况。它不干净,而且,如果我有很多派生类怎么办。答案 0 :(得分:2)
你应该能够通过双重调度解决这个问题:
class Writer
{
public:
void write(const B* x)
{
x->on_write(*this);
}
void accept(const D1* x);
void accept(const D2* x);
};
class B
{
public:
virtual void on_write(Writer& x) = 0;
};
class D1 : public B
{
public:
void on_write(Writer& x) override { x.accept(this); }
};
class D2 : public B
{
public:
void on_write(Writer& x) override { x.accept(this); }
};