2011-06-27 22 views
0

在我的节目,我有一个基类对象和载体。我有一个操作要在每个Object *上执行,但操作取决于Object *的派生类。因此,我使用访问者模式。但是,我发现访问者模式会导致大量的耦合;每当我添加一个新的Object派生类时,我都必须更改基础Visitor和派生自Visitor的每个类。如何根据其运行时类型而不是基类型对列表中的对象进行操作?

是否有执行不会导致如此高的耦合基于其运行时类型对象的列表上的操作更简单的方法?

+0

如何虚函数? –

+0

你能否提供更多的细节和/或你想要做的事情的例子? – Anton

+0

我没有指定派生类的操作集应该能够在运行时更改。访问者将这组操作封装到一个类中,该类可以在运行时进行子类化和切换。 –

回答

1

我要去的字里行间和猜测,你最派生的对象必须是唯一给他们,并在任何其他派生的对象是不存在的成员函数,这就是为什么你不想将它们添加到基类。

您可以使用dynamic_cast,看看一个指针属于最派生类,然后调用函数,如果它。

MyBase * pBase = *iterator; 
MyDerived * pDerived = dynamic_cast<MyDerived *>(pBase); 
if (pDerived != NULL) 
    pDerived->UniqueMethod(); 
0

任何虚函数会做...

Object* obj; 
//... 
obj->doOperation(); 
2
class Object 
{ 
    virtual void action() = 0; 
    /* ... */ 
}; 

void objectAction(Object * o) { o->action(); } 

int main() 
{ 
    std::vector<Object*> v; 
    std::for_each(v.begin(), v.end(), objectAction); 
} 

现在只是实现每个派生类action

0

你的抽象基类(称之为“对象”)提供了抽象的实施框架,每个继承类必须实现。您只需在基类的每个实例上调用适当的方法。像这样的东西(在C#中,因为我的C++是相当腐蚀,但你应该明白我的意思):

public abstract class Widget 
{ 
    public void MandatoryMethod() ; // no method implementation 
} 

public class FooConcreteWidget : Widget 
{ 
    public override void MandatoryMethod() 
    { 
    // some concreted implementation 
    } 
} 
public class BarConcreteWidget : Widget 
{ 
    public override void MandatoryMethod() 
    { 
    // another concrete implementation 
    } 
} 

... 
List<Widget> Widgets = GetSomeWidgets() ; 

for (Widget widget in Widgets) 
{ 
    widget.MandatoryMethod() ; 
} 

这是对所有有它。

相关问题