C #: Возбуждение унаследованного события

138
задан jwarzech 16 April 2009 в 13:58
поделиться

3 ответа

Что вы должны сделать, это:

В вашем базовом классе (где вы объявили события) создайте защищенные методы, которые можно использовать для вызова событий:

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);
    }
}
149
ответ дан 23 November 2019 в 23:20
поделиться

Вы можете получить доступ только к событию в объявленном классе, так как .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) из любой точки этого класса или ниже иерархии наследования для вызова. событие.

121
ответ дан 23 November 2019 в 23:20
поделиться

Я предполагаю, что не могу получить доступ к этим событиям так же, как к другим унаследованным членам?

Точно. Обычно для каждого события в базовом классе предусмотрена защищенная функция OnXyz или RaiseXyz , позволяющая вызывать из унаследованных классов. Например:

public event EventHandler Loading;

protected virtual void OnLoading() {
    EventHandler handler = Loading;
    if (handler != null)
        handler(this, EventArgs.Empty);
}

Вызывается в унаследованном классе:

OnLoading();
8
ответ дан 23 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: