访客模式 "does not implement interface" 错误

Visitor Pattern "does not implement interface" error

第一次尝试实现访问者模式(使用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)'

...但是为什么呢?我是通过 visit(SomeClass someobject)!

实现的

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

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

然后一切正常,但是这样实现应该是没有必要的(第一次访问的方式应该就够了!)

接口 VisitorElement 要求您的 class 实现方法 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) { }
}

这样,只要不将 Visitor 实例转换为非泛型 VisitorElement,就只能调用 visit (SomeClass someobject) 重载。在非泛型 visit 方法中,您可以尝试将 visitable 转换为 SomeClass 并将泛型版本称为回退(或做任何您喜欢的事情)。


由于我不完全清楚你想要实现什么,所以很难说在你的情况下什么是最好的。