C # : 상속 된 이벤트 발생
다음과 같은 이벤트가 포함 된 기본 클래스가 있습니다.
public event EventHandler Loading;
public event EventHandler Finished;
이 기본 클래스에서 상속받은 클래스에서 이벤트를 발생시킵니다.
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
다음과 같은 오류가 발생합니다.
'BaseClass.Loading'이벤트는 + = 또는-= (BaseClass ')의 왼쪽에만 표시 될 수 있습니다.
상속받은 다른 회원과 동일한 이벤트에 액세스 할 수 없다고 가정합니다.
당신이해야 할 일은 이것입니다 :
이벤트를 선언 한 기본 클래스에서 이벤트를 발생시키는 데 사용할 수있는 보호 된 메소드를 작성하십시오.
public class MyClass
{
public event EventHandler Loading;
public event EventHandler Finished;
protected virtual void OnLoading(EventArgs e)
{
EventHandler handler = Loading;
if( handler != null )
{
handler(this, e);
}
}
protected virtual void OnFinished(EventArgs e)
{
EventHandler handler = Finished;
if( handler != null )
{
handler(this, e);
}
}
}
이벤트 핸들러를 호출해야하는지 여부를 확인하려면 해당 메소드를 변경해야합니다.
그런 다음이 기본 클래스에서 상속 된 클래스에서 OnFinished 또는 OnLoading 메소드를 호출하여 이벤트를 발생시킬 수 있습니다.
public AnotherClass : MyClass
{
public void DoSomeStuff()
{
...
OnLoading(EventArgs.Empty);
...
OnFinished(EventArgs.Empty);
}
}
.NET은 실제로 델리게이트를 보유하는 씬 뒤에 프라이빗 인스턴스 변수를 생성하므로 선언 클래스의 이벤트에만 액세스 할 수 있습니다. 이거 ..
public event EventHandler MyPropertyChanged;
실제로이 작업을 수행하고 있습니다.
private EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
그리고 이걸 ...
MyPropertyChanged(this, EventArgs.Empty);
실제로 이것은 ...
myPropertyChangedDelegate(this, EventArgs.Empty);
따라서 선언 클래스 내에서만 전용 대리자 인스턴스 변수에만 액세스 할 수 있습니다.
컨벤션은 선언 클래스에서 이와 같은 것을 제공하는 것입니다.
protected virtual void OnMyPropertyChanged(EventArgs e)
{
EventHandler invoker = MyPropertyChanged;
if(invoker != null) invoker(this, e);
}
그런 다음 OnMyPropertyChanged(EventArgs.Empty)
해당 클래스의 어느 곳에서나 상속 계층 아래에서 호출하여 이벤트를 호출 할 수 있습니다.
상속받은 다른 회원과 동일한 이벤트에 액세스 할 수 없다고 가정합니다.
정확하게. 상속 된 클래스에서 발생시킬 수 있도록 보호 된 기능을 제공 OnXyz
하거나 RaiseXyz
기본 클래스의 각 이벤트에 대해 관례 입니다. 예를 들면 다음과 같습니다.
public event EventHandler Loading;
protected virtual void OnLoading() {
EventHandler handler = Loading;
if (handler != null)
handler(this, EventArgs.Empty);
}
상속 된 클래스에서 호출됩니다.
OnLoading();
이 방법으로 시도해 볼 수 있습니다.
public delegate void MyEventHaldler(object sender, EventArgs e);
public class B
{
public virtual event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}
public class D : B
{
public override event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}
not to resurrect an old thread but in case anybody is looking, what I did was
protected EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
This lets you inherit the event in a derived class so you can invoke it without requiring to wrap the method while keeping the += syntax. I guess you could still do that with the wrapping methods if you did
public event EventHandler MyPropertyChanged
{
add { AddDelegate(value); }
remove { RemoveDelegate(value); }
}
참고URL : https://stackoverflow.com/questions/756237/c-raising-an-inherited-event
'Programing' 카테고리의 다른 글
$ routeParams가 해결 기능에서 작동하지 않습니다 (0) | 2020.06.22 |
---|---|
존재하는 경우 BackStack에서 조각을 재개하는 방법 (0) | 2020.06.22 |
LINQ 식의 String.IsNullOrWhiteSpace (0) | 2020.06.22 |
Java executors : 작업이 완료되면 차단하지 않고 알림을받는 방법? (0) | 2020.06.22 |
jQuery : 텍스트 상자 내에서 Tab 키 누르기를 캡처하는 방법 (0) | 2020.06.22 |