1

私は C# に移行しようとしている Java プログラマーであり、Java で慣れていることを C# で行う方法があることを望んでいます。抽象オブジェクトの宣言でメソッドを次のようにオーバーライドします。

//This is the way I do it in Java and want to do in C#
Keyword k = new Keyword("quit"){
    public abstract void do(String context){
        //TODO Do stuff
    }
};

これは、私がJavaでしばらくやっていたテキストゲームのものです。抽象クラス、仮想クラス、匿名クラスを調べましたが、これを正確に行うクラスはありません。抽象化と仮想化では、まったく新しいサブクラスを作成する必要がありますが、これには時間がかかり、大規模に実行することはできません。匿名クラスでは (私が知る限り) メソッドをオーバーライドすることはできません。フィールドだけであり、信頼できる安定性を提供しません。

これを行う方法または同様の方法がある場合は、説明してください。御時間ありがとうございます。

4

3 に答える 3

3

これは C# では機能しません。Keyword から継承する新しいクラスを作成する必要があります。

public class MyKeyword : Keyword
{
    public MyKeyword(string s) : base(s)
    { }

    public override void do(string context)
    {
        // TODO: Do stuff.
    }
}

C# の匿名型は、パブリック メソッドを提供できるクラスではありません。これらにはプロパティのみがあり、複雑なデータをある行から次の行に渡すためのメソッド内の迅速な方法となることを目的としています。

正直に言うと、あなたが示しているようなことが Java でできるとは知りませんでした。つまり、インラインクラスの派生のようなものとして理解している場合です。

Brian Rasmussen は、デリゲートの使用について言及しています。それは次のようになります。

public delegate void DoSomething(string context);
public class Keyword
{
    public DoSomething Do;

    private void CallsDo()
    {
        if (Do != null)  Do("some string");
    }
}

次に、それに割り当てることができます:

Keyword k = new Keyword();
k.Do = (ctx) => { /* Do something with ctx string */ };
于 2012-06-29T22:40:25.273 に答える
0

このアプローチにはデリゲートを利用できます。例に注意してください

public class Keyword
{
     public delegate void Do();
}

//Area of Execution
{
   //...
   Keyword k = new Keyword();
   k.Do = delegate() 
   {
       Console.Writeln("Anonymous Inner function assigned to a callback function i.e a Delegate!");  
   };
}

これらはC/C ++の関数ポインタによく似ていますが、背景によっては何の意味もない場合があります。

デリゲートは、簡単に言えば、メソッド/関数をカプセル化するタイプセーフなオブジェクトです。これが意味するのは、1つまたは複数のメソッドへの参照を維持し、メソッド自体ではなく、デリゲートオブジェクトを介して後でそれらを呼び出すことができるということです。説明したように、Javaのメソッドに割り当てるのとほぼ同じように、匿名関数を右側に割り当てることができます。

お役に立てれば。代表者の詳細については、こちらをご覧ください

代表者

于 2012-06-29T23:52:19.477 に答える
0

デリゲートはおそらくあなたが求めているものです。

于 2012-06-29T22:46:00.143 に答える