프로그램의 유연성을 고려하여 프로그램의 목적이 변경되었음을 감안할 때 현재 구축 중입니다. 기존 클래스가 구현할 인터페이스를 추가하고 싶습니다. 다음과 같이이벤트 핸들러, 새로운 인터페이스에 대한 기존 클래스
기존 클래스
public class ClassA
{
#region Events
public delegate void DataReceivedHandler(object sender, EventArgs e);
public delegate void DataSentHandler(object sender, EventArgs e);
public delegate void StatusUpdatedHandler(object sender, EventArgs e);
public event DataReceivedHandler DataReceived;
public event DataSentHandler DataSent;
public event StatusUpdatedHandler StatusUpdated;
#endregion
//rest of code here...
}
새 인터페이스
public interface IClassA
{
event EventHandler DataReceived;
event EventHandler DataSent;
event EventHandler StatusUpdated;
//rest of code here...
}
내 세 가지 질문이 있습니다.
Q1. 처음에 클래스에서 내 자신의 대리자를 선언 할 권리가 있습니까? 예 : public delegate void DataReceivedHandler
또는 이러한 이벤트를 제거하고 이벤트를 일반 EventHandler로 바꿔야합니다. 즉 public event EventHandler DataReceived
입니다. 이러한 이벤트가 이벤트와 함께 데이터를 전달하지 않는다는 것을 감안할 때, 구독 한 항목에 무언가가 변경되었음을 알리는 것만으로 변경됩니다.
2. 위의 질문과 밀접하게 관련되어 있습니다. 클래스의 속성, 즉 status (StatusUpdated)를 변경하려고합니다. 새 상태를 사용자 지정 EventArgs로 전달하는 것이 가장 좋습니다. 따라서 원래 코드와 마찬가지로 사용자 지정 대리자가 필요합니까? 현재 작동하므로 이벤트가 시작되고 가입 된 클래스는 발신자 값, 즉 (ClassA와 같은 발신자) 상태를 사용할 수 있습니다. 상태. 모범 사례가 있습니까 아니면 개발자에게 달려 있습니까?
3. 이제 그 일이 끝났습니다. 인터페이스에 관한 부분. 인터페이스에서 DataReceived 및 다른 이벤트를 올바르게 선언하여이를 구현으로 표시 할 클래스와 일치 시키십시오. 당신이 인터페이스 방법에 대한 사용자 정의 위임이 필요하면 그들이 특정 구현에 묶여 있지 않기 때문에, 당신은 (클래스 외부)을 개별적으로 선언해야
나는 당신과 Jamiecs을 두 가지 접근 방식을 시도하고 답변 주셔서 모두 감사했다. 나는 Action <>을 사용하는 것을 선호한다. GUI 호출에도 사용되는 것을 보았다. 익숙해지는 좋은 생각이다. 이 접근법에서 볼 수있는 유일한 단점은 자동 완성이 부족하다는 것입니다. 이전 이벤트에서 myClassA.StatusUpdated + = ....를 입력하면 + =는 자동으로 이벤트를 처리하는 메서드를 만듭니다 (사용자 정의 이벤트 args도 포함). 액션을 사용하면이 경우가 아니므로 직접 메소드를 작성해야합니다. – JonWillis
선호도에 대한 또 다른 이유는 강력한 형식의 보낸 사람이지만 위임을 통해 얻을 수 있습니다. – JonWillis
@Jon : 확실합니까? 위임자 서명 ('+ =', 타입'Tab'을 두 번 치고 메소드 스텁을 생성해야 함)에 관계없이 결코 그런 문제가 없었습니다. – Groo