この質問にはすでに答えがあります。
私はそのようなインターフェースを持つクラスがあります:
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でそれを実装した方法から来ています。
イベントを使うことであなたはそれを達成することができます
class HcmTerminal {
public event Action<bool> OnDataReceived;
public void Launch()
{
OnDataReceived?.Invoke(true /*or false*/);
}
}
あなたはその後することができます:
var myTerminal = new HcmTerminal();
myTerminal.OnDataReceived += (isCompleted) => {};
インタフェースを実装するクラスを定義します。
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);
});