我有一些类Street
,Streetlamp
,House
和Tree
等等,这些类派生自基类AbstractClass
。这两个类都有一组Instruction
类型的不同成员变量,它们表示如何构建/植物"房子,树或灯。例如:
class House : public AbstractClass {
public:
Instruction foundation;
Instruction walls;
Instruction roof;
};
class Tree : public AbstractClass {
public:
Instruction hole;
};
包含不同对象的容器vector<AbstractClass*>
将传递给第三个类Builder
,该类应使用元素中包含的指令来构建&#34;他们按顺序。 Builder可以有一个方法void buildElement(AbstractClass*)
,根据说明,必须执行不同的操作(&#34;挖掘&#34;,&#34;种植&#34;,&#34;驾驶&#34;)< / p>
目前我只使用一个类,它包含大量(不必要的)信息,包括每个对象中的enum type
以指定它具有的类型。
如何在C ++中有效地实现这种多态性的情况?
访客模式在这里适用吗?或者我应该使用像dynamic_cast
和typeid
这样的RTTI机制。或者有更好的方法吗?
答案 0 :(得分:0)
向Build()
添加抽象AbstractClass
方法,其中AbstractClass
的每个衍生产品根据需要实现Build()
:
class AbstractClass {
public:
virtual ~AbstractClass() {}
virtual void Build() = 0;
};
class House : public AbstractClass {
public:
Instruction foundation;
Instruction walls;
Instruction roof;
virtual void Build() {
// build foundation, walls, and roof as needed...
}
};
class Tree : public AbstractClass {
public:
Instruction hole;
Instruction plant;
virtual void Build() {
// dig hole and plant tree as needed...
}
};
然后Builder
可以遍历每个对象上的vector
调用Build()
:
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
for(std::vector<AbstractClass*>::iterator i = elements.begin(); i != elements.end(); ++i) {
i->Build();
}
或者:
void buildElement(AbstractClass* element) {
element->Build();
}
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
std::for_each(elements.begin(), elements.end(), &buildElement);
}
或者:
void Builder::buildElements(std::vector<AbstractClass*> &elements) {
std::for_each(elements.begin(), elements.end(),
[](AbstractClass* element) { element->Build(); }
);
}