代码之家  ›  专栏  ›  技术社区  ›  brendanjhart

尝试将LOX语言实现从手工艺解释器手册移植到C时遇到泛型问题#

  •  1
  • brendanjhart  · 技术社区  · 7 年前

    Crafting Interpreters Bob Nystrom的书,并试图用C重新创建JLOX语言解释器。

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

    我曾试图将Java代码翻译成C,但现在遇到了以下编译器错误:

    "ASTPrinter.VisitBinaryExpr(Expression.Binary): No suitable method found to override" (单击以查看图像)

    两个相关的代码文件是:

    使用系统;

    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...
        }
    }
    

    :

    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();
            }
        }
    }
    

    :

    重写公共字符串VisitBinaryExpr(Expression.Binary Expression)

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

    我想我只是对C#泛型返回类型了解得不够。

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Enigmativity    7 年前

    Expression.Visitor<string> 是一个接口,因此没有任何可重写的内容。

    简而言之:

    public string VisitBinaryExpr(Expression.Binary expression)
    

    你只需要 override 当基类已经定义了一个具有与声明为相同签名的方法时 vitrual abstract .

    在你的情况下 ASTPrinter System.Object .