Что вы должны сделать, это:
В вашем базовом классе (где вы объявили события) создайте защищенные методы, которые можно использовать для вызова событий:
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);
Таким образом, вы можете (очевидно) получить доступ только к частной переменной экземпляра делегата из объявленного class.
Соглашение состоит в том, чтобы обеспечить нечто подобное в объявленном классе.
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();