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

}

returnステートメント内でメソッドnextTokenを定義するときにエラーが発生するため、C#でそれを行う方法のヒントを教えてください。

ありがとう!

4

3 に答える 3

4

C# には (必要な意味で) 匿名クラスはありません。のカスタム実装のインスタンスを返したい場合は、TokenStreamそれを定義して名前を付ける必要があります。

例えば。:

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

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

見る:

参考のため。

kanが指摘したように、C# (および Java 8 も) では、通常、代わりにデリゲートまたはラムダを使用します。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

代わりにデリゲートを使用してください。例: http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx

于 2014-01-15T12:39:51.253 に答える
1

これがあなたの望む結果かどうかはわかりません。

しかし、私が見る方法は、オブジェクトを返すTokenStreamメソッドを持つオブジェクトを返したいだけですnextTokenToken

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 に答える