-1

この質問にはすでに答えがあります。

私はそのようなインターフェースを持つクラスがあります:

 public class hcmTerminal {

    ... Code

    public interface onDataReceived {
        void isCompleted(bool done);
    }

}

このクラスの中に私はパブリックプロパティを持っています:

public onDataReceived mDataReceived;

それから私はデリゲートを設定する機能があります。

public void setDataReceived(onDataReceived dataReceived) { mDataReceived = dataReceived; }

hcmTerminalクラスの中で、私はデリゲートを呼んでいます。

mDataReceived.isCompleted(true);

しかし、そのデリゲートが呼び出されたときに実際に取得するための構文を理解することはできません。Javaでは、次のようにできます。

myTerminal.setDataReceived(new hcmTerminal.onDataReceived(){

    @Override
    public void isCompleted(boolean done){

        ... Code

    }

});

しかし、C#でそれを試すと、次のようになります。

抽象またはインタフェースのインスタンスを作成できません   'hcmTerminal.onDataReceived'

以前にC#でインターフェースを作成する必要はありませんでした。このコードは、私がJavaでそれを実装した方法から来ています。


  • 私は...するだろう非常にC#を書くときは.NETの命名規則に、Javaを書くときはJavaの命名規則に従うことを強くお勧めします。現在あなたは両方に違反しています。 - Jon Skeet
  • それで、あなたはインターフェースのメソッドがデリゲートではないことを知っています。 C#には、インターフェースの代わりに使用するデリゲート型があります。しかし、インターフェースを使用する場合は、そのインターフェースを実装するクラスを作成する必要があります。 - juharr
  • あなたのインターフェースに関して - デリゲートではなくインターフェースを作成している理由はありますか?君はトークデリゲートについてですが、あなたはインターフェースを宣言しています... - Jon Skeet
  • 代わりにイベントを使用してはいけませんか。msdn.microsoft.com/ja-jp/library/aa645739(v=vs.71).aspx - Pawel Gradecki
  • 最も良い複製が見つかったかどうかわからない、その他 - bing.com/… - Alexei Levenkov

2 답변


2

イベントを使うことであなたはそれを達成することができます

 class HcmTerminal {
      public event Action<bool> OnDataReceived;

      public void Launch()
      {
           OnDataReceived?.Invoke(true /*or false*/);
      }

 }

あなたはその後することができます:

var myTerminal = new HcmTerminal();
myTerminal.OnDataReceived += (isCompleted) => {};


2

インタフェースを実装するクラスを定義します。

class MyDataReceived : hcmTerminal.onDataReceived {
    public void isCompleted(bool done) {
        Console.WriteLine("call to isCompleted. done={0}", done);
    }
}

今すぐ呼び出すことができますmyTerminal.setDataReceived(new MyDataReceived())

ただし、これはC#でコーディングされたJavaソリューションであり、「ネイティブ」C#ソリューションではありません。より良い方法は、インターフェースの代わりにデリゲートを定義することです。

public class HcmTerminal {
    ... Code
    public delegate void OnDataReceived(bool done);
}

これにより、メソッド名の提供、匿名デリゲートの提供、ラムダの使用など、デリゲート実装を提供するために複数のC#機能を使用できます。

myTerminal.setDataReceived((done) => {
    Console.WriteLine("call to isCompleted. done={0}", done);
});

リンクされた質問


関連する質問

最近の質問