访客模式“未实现接口”错误

时间:2015-01-22 15:12:32

标签: c# design-patterns visitor

这是我第一次尝试实施访客模式(使用c#),如果我做错了,我很抱歉!但是,我实现了这种访问者模式:

public interface VisitableElement
{
    void accept (VisitorElement visitor); 
}

public interface VisitorElement
{
    void visit (VisitableElement visitable);
}

public class SomeClass : VisitableElement
{
    ...
    public void accept(VisitorElement visitor)
    {
        ...
    }
}
//here there are other classes which implement VisitableElement (not useful for the example)

class Visitor: VisitorElement
{
...
    public void visit (SomeClass someobject)
    {
        ...
    }
//othes implementation of visit (one for each element of class of the hierarcy)
...
}

但是当我尝试编译时会返回此错误:

Error   1   'Visitor' does not implement interface member 'NameSpace.VisitorElement.visit(NameSpace.VisitableElement)'

......但为什么呢?我通过访问实现了它(SomeClass someobject)!

有趣的是,如果我尝试添加:

    public void visit(VisitableElement visitable)
    {
        this.visit(visitable);
    }

然后一切正常,但是以这种方式实现它应该是不必要的(并且第一次访问方法应该足够了!)

1 个答案:

答案 0 :(得分:3)

接口VisitorElement要求您的类实现方法void visit (VisitableElement visitable)

您实现的visit方法不符合此要求,因为它只允许类型为SomeClass的参数。

虽然每个SomeClass都是VisitableElement,但接口要求该方法接受任何实现VisitableElement的类型,而不仅仅是SomeClass


如果您希望visit方法仅接受SomeClass类型的参数,请考虑使用通用VisitorElement<T>和显式接口实现:

public interface VisitableElement
{
    void accept (VisitorElement visitor); 
}

public class SomeClass : VisitableElement
{
    public void accept(VisitorElement visitor) { }
}

public interface VisitorElement
{
    void visit (VisitableElement visitable);
}

public interface VisitorElement<T> : VisitorElement where T : VisitableElement
{
    void visit (T visitable);
}

class Visitor: VisitorElement<SomeClass>
{
    public void visit (SomeClass someobject) { }

    void VisitorElement.visit(VisitableElement visitable) { }
}

这样,只要您不将visit (SomeClass someobject)实例转换为非通用Visitor,就只能调用VisitorElement重载。在非通用visit方法中,您可以尝试将visitable转换为SomeClass并将通用版本称为后备(或执行任何您喜欢的操作)。


由于我并不完全清楚你想要达到什么目标,因此很难说在你的情况下做什么是最好的。