c# - 访客模式 "does not implement interface"错误

标签 c# design-patterns visitor-pattern

这是我第一次尝试实现访问者模式(使用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要求您的类实现方法 void visit (VisitableElement visitable) .

visit您实现的方法不满足此要求,因为它只允许 SomeClass 类型的参数.

虽然每个SomeClassVisitableElement , 该接口(interface)要求该方法接受任何实现 VisitableElement 的类型,不仅SomeClass .


如果你想要你的 visit方法只接受 SomeClass 类型的参数, 考虑使用通用 VisitorElement<T>和一个明确的接口(interface)实现:

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方法,你可以尝试投 visitableSomeClass并将通用版本称为回退(或做任何你喜欢的事)。


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

关于c# - 访客模式 "does not implement interface"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092198/

相关文章:

c# - GOTO inside using block,对象会被处置吗?

c# - 带有 Singleton Logger 类的 DI/IoC

c# - NRefactory AST Visitor,某些节点没有访问方法?

c++ - 在现代 C++ 中为层次图定义访问者内联

c++ - 如何将访问者界面适配为迭代器界面?

c# - 解析日期时间字符串

c# - WPF 的 ICollectionView.filter 具有大量数据

c# - 在 C# 中将字符串转换为 XmlNode 的更好方法

c# - 父子类关系设计模式

java - 在特定位置设置相机动画