Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
tantal
1

Имеется базовый класс с некоторым событием, как вызвать это событие в дочернем классе?

24.05.2009, 14:08. Просмотров 3314. Ответов 2
Метки нет (Все метки)

Братцы, что то я отморозился, помогите разобраться с концепцией...
Суть проблемы, имеется базовый класс с некоторым событием, как вызвать это событие в дочернем классе?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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!'));
        }
    }
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2009, 14:08
Ответы с готовыми решениями:

Вызов виртуальной функции, определённой в дочернем классе, через указатель на базовый класс
Как вызвать виртуальную функцию, определённую в дочернем классе, через указатель на базовый класс?...

Android studio как вызвать вложенный класс в дочернем фрагменте
Есть класс с TabLayout и ViewPager. Адаптер заносит в него 2 страницы с фрагментами. На страницах...

Не могу в дочернем классе вызвать protected метод
Всем привет! Начал писать одну программку, и столкнулся со следующей проблемой: у меня пока 2...

Получить родительский класс в дочернем классе
Здравствуйте. Подскажите пожалуйста есть следующие классы class A { #methods } class B...

2
Name_fa
5 / 5 / 1
Регистрация: 01.10.2008
Сообщений: 85
24.05.2009, 15:12 2
События можно вызывать только из того класса, в котором оно объявлено. Чтобы вызывать из ихз производных классов, применяются специальные схемы.

Типовая схема с событиями такая:
1) Во-первых, событие должно называться не OnSystemException, а просто SystemException (это не требование и не синтаксис, просто соглашение; поверьте мне, если следовать такого рода соглашениям, становится гораздо легче)
2) Соответствующий делегат называется SystemExceptionEventHandler, и объявлен должен быть вне класса.
3) Событие должно иметь два аргумента: object sender, SystemExceptionEventArgs arguments. А уже класс SystemExceptionEventArgs содержит все необходимые параметры. Поверьте мне, это только на первый взгляд кажется громоздким и неудобным. Позже вы оцените.
3) Кроме события, базовый класс должен содержать protected, virtual метод, называющийся OnSystemException, который только и делает, что вызывает это событие.

Выигрыш такой:
1) Производный класс может принудительно вызывать событие, просто вызывая этот protected-метод.
2) Производный класс может перекрыть этот метод, если он хочет реагировать на событие (в самом деле, не вешаться же на свое собственное событие!)
3) Производный класс (опять же перекрыв метод) может вообще запретить или как-то ограничить возникновение этого события.
4) Стандартизация, читаемость кода и все такое

В вашем случае так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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!' ) );
    }
}
0
tantal
24.05.2009, 15:53 3
Огромное спасибо за расширенный и полный ответ...

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

Успехов
tantal
24.05.2009, 15:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2009, 15:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B?
#include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot....

Класс: Как обработать событие последнего объекта в форме, не создавая в классе объекта промежуточное событие?
Итак! Проблема состоит в следующем! Имеется класс в который входит объект второго класса. В...

Указатели в базовом классе на базовый класс и производный класс
Пишу контейнер "Бинарное дерево поиска" для частотного словаря. С самим контейнером особо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.