最近我尝试了访问者模式的实现,我尝试使用通用接口强制执行Accept&Visit方法:
public interface IVisitable<out TVisitable> where TVisitable : IVisitable<TVisitable>
{
TResult Accept<TResult>(IVisitor<TResult, TVisitable> visitor);
}
Run Code Online (Sandbox Code Playgroud)
- 其目的是1)将某些类型的"Foo"标记为可由这样的访问者访问,而访问者又是"这种类型Foo的访问者",2)在实现访问类型上强制执行正确签名的Accept方法,如此:
public class Foo : IVisitable<Foo>
{
public TResult Accept<TResult>(IVisitor<TResult, Foo> visitor) => visitor.Visit(this);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,访客界面非常好:
public interface IVisitor<out TResult, in TVisitable> where TVisitable : IVisitable<TVisitable>
{
TResult Visit(TVisitable visitable);
}
Run Code Online (Sandbox Code Playgroud)
- 1)标记访问者"能够访问"TVisitable 2)该TVisitable的结果类型(TResult)应该是3)强制执行访问方法每个TVisitable访问者实现"能够访问"的正确签名,像这样:
public class CountVisitor : IVisitor<int, Foo>
{
public int Visit(Foo visitable) => 42;
}
public class NameVisitor : IVisitor<string, Foo>
{
public string Visit(Foo visitable) => "Chewie";
}
Run Code Online (Sandbox Code Playgroud)
非常愉快和漂亮,这让我写道:
var …Run Code Online (Sandbox Code Playgroud)