这是我第一次尝试实现访问者模式(使用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
类型的参数.
虽然每个SomeClass
是 VisitableElement
, 该接口(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
方法,你可以尝试投 visitable
至 SomeClass
并将通用版本称为回退(或做任何你喜欢的事)。
由于我不完全清楚您想实现什么,所以很难说在您的情况下最好做什么。
关于c# - 访客模式 "does not implement interface"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092198/