-1

이 질문에는 이미 답변이 있습니다.

인터페이스가있는 클래스가 있습니다.

 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에서 구현 한 방법에서부터옵니다.


  • 나는대단히C #을 작성할 때 .NET의 명명 규칙을 따르고 Java를 작성할 때는 Java를 강력히 권장합니다. 현재 두 가지를 모두 위반하고 있습니다. - Jon Skeet
  • 인터페이스의 메서드가 대리자가 아니라는 것을 알았습니다. C #에는 인터페이스 대신 사용되는 대리자 형식이 있습니다. 그러나 인터페이스를 사용하는 경우 해당 인터페이스를 구현하는 클래스를 만들어야합니다. - juharr
  • 인터페이스에 관해서는 대리자가 아닌 인터페이스를 만드는 이유가 무엇입니까? 당신이야기대리자에 대해 이야기했지만 인터페이스를 선언하는 중 ... - Jon Skeet
  • 대신 이벤트를 사용하지 않아도 되나요?msdn.microsoft.com/en-us/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 #솔루션이 아니라 C #으로 코딩 된 Java 솔루션입니다. 더 나은 방법은 인터페이스 대신 대리자를 정의하는 것입니다.

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

이렇게하면 메서드 이름을 제공하거나 익명의 대리자를 제공하거나 람다를 사용하는 등 대리자 구현을 제공하기 위해 여러 C #기능을 사용할 수 있습니다.

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

연결된 질문


관련된 질문

최근 질문