C# “访客模式”;不实现接口“;错误
这是我第一次尝试实现访问者模式(使用c#),如果我做错了,我很抱歉!但是,我实现了这个访问者模式:C# “访客模式”;不实现接口“;错误,c#,design-patterns,visitor,C#,Design Patterns,Visitor,这是我第一次尝试实现访问者模式(使用c#),如果我做错了,我很抱歉!但是,我实现了这个访问者模式: public interface VisitableElement { void accept (VisitorElement visitor); } public interface VisitorElement { void visit (VisitableElement visitable); } public class SomeClass : VisitableEl
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);
}
然后一切都可以正常工作,但是应该不需要以这种方式实现它(并且第一次访问方法应该足够了!)接口
visitorement
要求您的类实现方法void visit(visitablelement visitable)
您实现的visit
方法不满足此要求,因为它只允许类型为SomeClass
的参数
虽然每个SomeClass
都是一个visitablelement
,但接口要求该方法接受实现visitablelement
的任何类型,而不仅仅是SomeClass
如果您希望您的代码>访问< /C>方法只接受类型<代码> SomeClass < /代码>的参数,请考虑使用泛型<代码> VistoRealEngs/COD>和显式接口实现:
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) { }
}
公共接口VisitableElement
{
无效接受(访问者删除访问者);
}
公共类SomeClass:VisitableElement
{
公共无效接受(访问者删除访问者){}
}
公共接口访问元素
{
无效访问(可访问元素可访问);
}
公共接口VisiteElement:VisiteElement,其中T:VisiteElement
{
无效访问(T可访问);
}
类访问者:visitorement
{
公共无效访问(SomeClass someobject){}
void visitorement.visit(visitablelement visitable){}
}
这样,只要不将Visitor
实例强制转换为非泛型visitoreElement,就只能调用visit(SomeClass someobject)
重载。在非泛型的visit
方法中,您可以尝试将visitable
转换为SomeClass
,并将泛型版本称为fallback(或执行任何您喜欢的操作)
因为我并不完全清楚你想要实现什么,所以很难说对你来说什么是最好的选择 什么是“NotUsefulStuff”?您还没有显示NotUsefulStuff类的定义。如果看不到这一点,很难提供帮助。检查VisiteElement接口的访问方法的签名,它接受VisiteElement而不是SomeClass。实现VisitableElement接口的Visitor类。我猜类Visitor
在实际代码中被称为NotUsefulStuff
。无论哪种方式,异常消息都与您发布的代码不匹配。也许你想更正它。很抱歉,我编辑了它(NotUsefulStuff
=Visitor
)嗯,我认为你是对的(关于出现错误的原因),但你认为我的解决方案解决了问题吗(我在文章底部谈论的是visit(visitablelement visitable)
的实现)?当然,如果你只是实现了这个方法,那么它显然是有效的。这就是错误消息告诉您的:-)