我正在尝试实现访客设计模式。 我对访问者模式及其经典实现有了基本的了解。 我正在尝试改变访客模式来实现我的特定目标。
具体目标:将返回类型添加到特定于正在访问的 Visitable(节点)的访问者模式。
到目前为止,我见过的访问者返回特定返回类型的经典示例可以通过泛型来实现。但这不符合我的目标:将返回类型添加到特定于正在访问的 Visitable(节点)的访问者模式。
这是我在发布我的问题之前查看的其他问题: 访客设计模式-返回类型 java - 从访问者返回一个值
实现访客模式,同时允许不同的函数返回类型 --> 这个问题确实提供了一个解决方案(即在访问者内部存储状态,但我不喜欢 API 的调用者或使用者需要记住在调用访问后恢复状态。
这里有一些代码来说明我的意思:
public interface IVisitor<TReturn>
{
TReturn Visit(VisitableClassReturnString visitableClass);
TReturn Visit(VisitibleClassReturnInt visitibleClass);
}
public class Visitor : IVisitor<string>
{
public string Visit(VisitableClassReturnString visitableClass)
{
// Return type is correct.
// Logic for visiting (just examples for a return typebelow)
return string.Empty;
}
public string Visit(VisitibleClassReturnInt visitibleClass)
{
// Return type is NOT correct.
// Logic for visiting (just examples for a return typebelow)
return 0;
}
}
如上面的代码所示,我有两个不同的访问者想要访问的可访问类(节点),在我的特定应用程序中,当我访问这两个节点时,我需要在访问时返回不同的类型。同样重要的是要注意,不同的返回类型仅特定于 Visitor 的具体实现,在实现 IVisitor 的所有其他情况下,节点都可能具有相同的返回类型。
使用单一通用无法实现这一点,有人对我如何实现我的目标有任何想法吗?
如果我理解正确,您的输入参数应该依赖于抽象,而不是可访问类的具体类型。
public interface IVisitor<TReturn, TVisistable> where TVisistable : IVisitable
{
TReturn Visit(TVisistable visitableObject);
}