이 질문에는 이미 답변이 있습니다.
인터페이스가있는 클래스가 있습니다.
public class hcmTerminal {
... Code
public interface onDataReceived {
void isCompleted(bool done);
}
}
이 수업의 내부에는 공공 재산이 있습니다.
public onDataReceived mDataReceived;
대리자를 설정할 함수가 있습니다.
public void setDataReceived(onDataReceived dataReceived) { mDataReceived = dataReceived; }
hcmTerminal 클래스에서 delegate를 호출하려고합니다.
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 #솔루션이 아니라 C #으로 코딩 된 Java 솔루션입니다. 더 나은 방법은 인터페이스 대신 대리자를 정의하는 것입니다.
public class HcmTerminal {
... Code
public delegate void OnDataReceived(bool done);
}
이렇게하면 메서드 이름을 제공하거나 익명의 대리자를 제공하거나 람다를 사용하는 등 대리자 구현을 제공하기 위해 여러 C #기능을 사용할 수 있습니다.
myTerminal.setDataReceived((done) => {
Console.WriteLine("call to isCompleted. done={0}", done);
});