每个访问节点具有不同返回类型的访问者模式

问题描述 投票:0回答:1

我正在尝试实现访客设计模式。 我对访问者模式及其经典实现有了基本的了解。 我正在尝试改变访客模式来实现我的特定目标。

具体目标:将返回类型添加到特定于正在访问的 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 的所有其他情况下,节点都可能具有相同的返回类型。

使用单一通用无法实现这一点,有人对我如何实现我的目标有任何想法吗?

c# oop design-patterns visitor-pattern
1个回答
0
投票

如果我理解正确,您的输入参数应该依赖于抽象,而不是可访问类的具体类型。

public interface IVisitor<TReturn, TVisistable> where TVisistable : IVisitable
  {
    TReturn Visit(TVisistable visitableObject);
  }
© www.soinside.com 2019 - 2024. All rights reserved.