Наследование событий.... C#
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Наследование событий.... C# Expand / Collapse
Автор
Сообщение
17.03.2003 13:31
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 15.12.2004 12:17
Сообщ.: 38, Visits: 419
Братцы, что то я отморозился, помогите разобраться с концепцией...
Суть проблемы, имеется базовый класс с некоторым событием, как вызвать это событие в дочернем классе?

public class BaseClass
{

public delegate void systemExceptionDelegate(Exception sysException);

public event systemExceptionDelegate OnSystemException;

public BaseClass()
{
//
// TODO: Add constructor logic here
//
}

public void Main()
{
SystemException sysEx = null;

sysEx = new SystemException("My system exception!");

OnSystemException(sysEx);

}
}

public class DerivedClass:BaseClass
{
public DerivedClass()
{
// nothing yet
}

public void DoSomeWork()
{
// вот тут хотелось бы вызвать event from base class
base.OnSystemException(new SystemException("Hello World!"));
}
}
Сообщ. #777104
17.03.2003 14:35
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 15.12.2003 1:17
Сообщ.: 85, Visits: 969
События можно вызывать только из того класса, в котором оно объявлено. Чтобы вызывать из ихз производных классов, применяются специальные схемы.

Типовая схема с событиями такая:
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!" ) );
}
}
Сообщ. #777106
17.03.2003 15:16
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 15.12.2004 12:17
Сообщ.: 38, Visits: 419
Огромное спасибо за расширенный и полный ответ...

Действительно потратил много времени на поиски данной темы на MSDN и в других источниках...

Успехов
tantal
Сообщ. #777113
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 10:55