Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “访客模式”;不实现接口“;错误_C#_Design Patterns_Visitor - Fatal编程技术网

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

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

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

接口
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)
的实现)?当然,如果你只是实现了这个方法,那么它显然是有效的。这就是错误消息告诉您的:-)