Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Visitor - Fatal编程技术网

C# 访客模式项目跟踪器

C# 访客模式项目跟踪器,c#,.net,visitor,C#,.net,Visitor,在具有如下接口的访问者模式的实现中(如果您认为接口本身是错误的,请随时告诉我),谁应该负责跟踪所访问的所有项目的列表?访客还是来访者?具体来说,跟踪器还必须负责确保同一项目不会被访问两次(如果我正在访问的图形包含循环引用) // ///定义可以接受访问者的类型。 /// /// 公共接口可移植 { //方法 无效接受(T实例、IVisitor访客); } /// ///定义访问对象的类型。 /// /// 公共接口IVisitor { //方法 无效访问(可访问); //性质 布尔已完

在具有如下接口的访问者模式的实现中(如果您认为接口本身是错误的,请随时告诉我),谁应该负责跟踪所访问的所有项目的列表?访客还是来访者?具体来说,跟踪器还必须负责确保同一项目不会被访问两次(如果我正在访问的图形包含循环引用)

//
///定义可以接受访问者的类型。
/// 
/// 
公共接口可移植
{
//方法
无效接受(T实例、IVisitor访客);
}
/// 
///定义访问对象的类型。
/// 
/// 
公共接口IVisitor
{
//方法
无效访问(可访问);
//性质
布尔已完成{get;}
}

访问者应跟踪其访问过的所有项目。与只知道可以访问的
IVisitable
相比,访问者总是知道自己访问了什么

任何其他解决方案都会增加耦合

作为您的接口,我将对其进行更改,使其看起来像这样:

public interface IVisitable<T>
{
    void Accept(IVisitor<T> visitor);
}

public interface IVisitor<T>
{
    bool Visit(T item);
}
这与:

var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine("The item: " + enumerator.Current);
}

访客应记录其访问过的所有项目。与只知道可以访问的
IVisitable
相比,访问者总是知道自己访问了什么

任何其他解决方案都会增加耦合

作为您的接口,我将对其进行更改,使其看起来像这样:

public interface IVisitable<T>
{
    void Accept(IVisitor<T> visitor);
}

public interface IVisitor<T>
{
    bool Visit(T item);
}
这与:

var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine("The item: " + enumerator.Current);
}

鉴于上面的接口,我不确定如何做到这一点。IVisitor是否应该使用Visit(T实例)方法,而不是Visit(IVisitable visitable)?或者它应该同时包含一个实例和一个可访问表吗?但是如果只有可访问表包含项目列表,那么访问者怎么知道迭代应该停止呢?我想访问整个图,直到所有节点都被访问。然后它应该一直返回true,直到不再调用它。对,但是谁应该负责确保同一个节点不会被访问两次?可访问的?还是应该实现IEnumerable?听起来更直截了当——应该跟踪访问项目的总是访问者(如我的示例)。如果这不是学校的作业,我会选择
IEnumerator
,而不是实现访客模式。网络上有几个例子。考虑到上面的接口,我不确定如何做到这一点。IVisitor是否应该使用Visit(T实例)方法,而不是Visit(IVisitable visitable)?或者它应该同时包含一个实例和一个可访问表吗?但是如果只有可访问表包含项目列表,那么访问者怎么知道迭代应该停止呢?我想访问整个图,直到所有节点都被访问。然后它应该一直返回true,直到不再调用它。对,但是谁应该负责确保同一个节点不会被访问两次?可访问的?还是应该实现IEnumerable?听起来更直截了当——应该跟踪访问项目的总是访问者(如我的示例)。如果这不是学校的作业,我会选择
IEnumerator
,而不是实现访客模式。网上有几个例子。
var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine("The item: " + enumerator.Current);
}