События
События можно вызывать только из того класса, в котором оно объявлено. Чтобы вызывать из ихз производных классов, применяются специальные схемы.
Типовая схема с событиями такая:
1) Во-первых, событие должно называться не OnSystemException, а просто SystemException (это не требование и не синтаксис, просто соглашение; поверьте мне, если следовать такого рода соглашениям, становится гораздо легче)
2) Соответствующий делегат называется SystemExceptionEventHandler, и объявлен должен быть вне класса.
3) Событие должно иметь два аргумента: object sender, SystemExceptionEventArgs arguments. А уже класс SystemExceptionEventArgs содержит все необходимые параметры. Поверьте мне, это только на первый взгляд кажется громоздким и неудобным. Позже вы оцените.
3) Кроме события, базовый класс должен содержать protected, virtual метод, называющийся OnSystemException, который только и делает, что вызывает это событие.
Выигрыш такой:
1) Производный класс может принудительно вызывать событие, просто вызывая этот protected-метод.
2) Производный класс может перекрыть этот метод, если он хочет реагировать на событие (в самом деле, не вешаться же на свое собственное событие!)
3) Производный класс (опять же перекрыв метод) может вообще запретить или как-то ограничить возникновение этого события.
4) Стандартизация, читаемость кода и все такое
В вашем случае так:
public class SystemExceptionEventArgs : EventArgs
{
private Exception _exception;
public Exception Exception
{
get { return _exception; }
}
public SystemExceptionEventArgs( Exception e )
{
_exception = e;
}
}
public delegate void SystemExceptionEventHandler( BaseClass sender, SystemExceptionEventArgs e );
public class BaseClass
{
public event SystemExceptionEventHandler SystemException;
protected virtual void OnSystemException( SystemExceptionEventArgs e )
{
if ( SystemException != null )
{
SystemException( this, e );
}
}
}
public class DerivedClass : BaseClass
{
public void DoSomeWork()
{
OnSystemException( new SystemExceptionEventArgs( new Exception( 'Hello World!' ) );
}
}