1

我最近发现了语言错误,作为学习过程的一部分,我开始通过 Bob Nystrom 的Crafting Interpreters一书,并尝试在 C# 中重新创建 JLOX 语言解释器。

JLOX 中的“J”是指本书中使用 Java 实现的示例代码。

在本书的“使用树”和“A(不是非常)漂亮的打印机”部分中,Bob 介绍了访问者模式作为“表达式问题”的解决方案。

我试图将 Java 代码翻译成 C#,但现在被以下编译器错误难住了:

“ASTPrinter.VisitBinaryExpr(Expression.Binary):找不到合适的方法来覆盖” (点击查看图片)

两个相关的代码文件是:

表达式.cs

使用系统;

namespace CSharpLox
{
    abstract public class Expression
    {
        abstract public T Accept<T>(Visitor<T> visitor);

        public interface Visitor<T>
        {
            T VisitBinaryExpr(Binary expr);
            // other expression type visitors removed for clarity...
        }

        public class Binary : Expression
        {
            public readonly Expression left;
            public readonly Token _operator;
            public readonly Expression right;

            public Binary(Expression left, Token _operator, Expression right)
            {
                this.left = left;
                this._operator = _operator;
                this.right = right;
            }

            override public T Accept<T>(Visitor<T> visitor)
            {
                return visitor.VisitBinaryExpr(this);
            }
        }

        // other expression types removed for clarity...
    }
}

ASTPrinter.cs

using System;
using System.Text;

namespace CSharpLox
{
    // ASTPrinter.cs
    public class ASTPrinter : Expression.Visitor<string>
    {
        override public string VisitBinaryExpr(Expression.Binary expression)
        {
            return parenthesize(expression._operator.lexeme, expression.left, expression.right);
        }

        private String parenthesize(String name, params Expression[] expressions)
        {
            StringBuilder builder = new StringBuilder();

            builder.Append("(").Append(name);

            foreach (Expression expression in expressions)
            {
                builder.Append(" ");
                builder.Append(expression.Accept(this));
            }

            builder.Append(")");

            return builder.ToString();
        }
    }
}

我不知道如何解决的错误在ASTPrinter.cs的这一行:

覆盖公共字符串 VisitBinaryExpr(Expression.Binary 表达式)

Visual Studio 编辑器报告的错误文本是:

错误 CS0115 'ASTPrinter.VisitBinaryExpr(Expression.Binary)':找不到合适的方法来覆盖

我想我只是对 C# 泛型返回类型知之甚少。

我一直在四处寻找有关泛型返回类型的信息,但到目前为止,我还没有找到一个清楚的例子来说明它如何与抽象接口的具体实现进行交互。或者,这可能是 C# 和 Java 的泛型功能差异太大而无法直接翻译实现的一个领域。

任何意见,将不胜感激。

4

1 回答 1

4

Expression.Visitor<string>是一个接口,所以没有什么可以覆盖的。

简单的说:

public string VisitBinaryExpr(Expression.Binary expression)

override当基类已经定义了具有相同签名的方法时,才需要声明为vitrualor abstract

在您的情况下,该类ASTPrinter直接派生自System.Object.

于 2017-07-21T03:33:11.397 回答