0

我正在尝试为以下 Java 编写一些等效的 C# 代码:

public class XLexer extends antlr.CharScanner implements TokenStream {
protected int stringCtorState = 0;

public String mString() { return ""; }

public Token nextToken()  {
       resetText(); // exists in CharScanner class
       return null; // will return something
}

public TokenStream plumb() {
    return new TokenStream() {
        public Token nextToken()  {
            resetText(); // exists in CharScanner class
            if (stringCtorState >= 0) { String x = mString(); }
            return null; // will return something
        }
    };
}

}

谁能给我一个提示如何在 C# 中执行此操作,因为在 return 语句中定义方法 nextToken 时出现错误。

谢谢!

4

3 回答 3

4

C# 中没有匿名类(在您需要的意义上)。如果你想返回一个自定义实现的实例TokenStream,你需要定义它并给它一个名字。

例如。:

public MyTokenStream {
    public Token nextToken() {
        // ...
    }
}

public TokenStream plumb() {
    return new MyTokenStream();
}

看:

以供参考。

正如kan所说,在 C#(以及 Java 8)中,您通常会使用委托或 lambda。如果 TokenStream 所做的只是返回一个 nextToken,它可以这样实现:

    public class TokenStream
    {
    }

    public class SomeClass
    {            
        public Func<TokenStream> Plumb()
        {
            // I'm returning a function that returns a new TokenStream for whoever calls it
            return () => new TokenStream();
        }
    }

    static void Main(string[] args)
    {
        var someClass = new SomeClass();
        TokenStream stream = someClass.Plumb()(); // note double brackets
    }

想想 JavaScript 中的一流函数,如果它有助于理解它的话。

新Java带来了函数式接口,类似:http: //java.dzone.com/articles/introduction-functional-1

于 2014-01-15T12:35:26.773 回答
1

不确定这是否是您想要的结果。

但我看到的方式是你只想返回一个TokenStream对象,该对象的方法nextToken返回一个对象Token

public class TokenStream
{
    public Token nextToken()
    {
         return new Token();
    }
}

那将是你的TokenStream班级,然后你可以有一个方法/函数在其他地方执行以下操作

public TokenStream plumb()
{
    return new TokenStream();
}

其中的用法是

TokenStream ts = plumb();
Token t = ts.nextToken();
于 2014-01-15T12:46:59.770 回答
1

改用委托。这里有一个例子:http: //msdn.microsoft.com/en-us/library/0yw3tz5k.aspx

于 2014-01-15T12:39:51.253 回答