powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / наследование событий в C#
16 сообщений из 16, страница 1 из 1
наследование событий в C#
    #38965854
breee3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуй форум. Может кто-нибудь подсказать, как правильно наследовать события.
а именно.
Есть абстрактный класс A с событием EventHandler AEvent
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class A
{
  public A()
  {
     this.AEvent += new EventHandlet(eh_AEvent);
  }
 
  protected void eh_AEvent(object e, EventArgs e)
  {
     //something
  }
 
  protected virtual event EventHandler AEvent;
}


Есть класс B наследованный от А
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class B : A
{
  public B : base()
  {
  }
 
  ...
}


1) как добиться чтоб получалось подписаться на событие в экземпляре класса B
Код: c#
1.
2.
 A b = new B();
 b.AEvent += new EventHAndler (b_Aevent);


2) чтоб ещё и при этом срабатывал обработчик в A
3) можно оставить field-like синтаксис события, или надо полную форму использовать с add\remove ?
...
Рейтинг: 0 / 0
наследование событий в C#
    #38965883
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, что Вы немного не по делу пытаетесь применить наследование

Если на Вашу задачу смотреть "в лоб", то вот такой код должен отвечать требованиям:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class BaseClass
{
    protected event EventHandler AEvent;
}

public class Inheritor : BaseClass
{
    public Inheritor()
    {
        this.AEvent += Inheritor_AEvent;
    }

    private void Inheritor_AEvent(object sender, EventArgs e)
    {
    }
}



Если все-таки что-то не так, расскажите по подробней про задачу, которую Вы пытаетесь решить
...
Рейтинг: 0 / 0
наследование событий в C#
    #38965903
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breee3, и чего Вы хотите этим добиться?

Обработчик eh_AEvent должен быть виртуальный, а не событие.
Хотя зачем классу подписываться на собственное событие? По идее класс должен его инициировать.
...
Рейтинг: 0 / 0
наследование событий в C#
    #38965936
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
наследование событий в C#
    #38965943
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВskyANA,
http://sergeyteplyakov.blogspot.ru/2011/02/c.html спасибо конечно, но зачем это ТСу?
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966297
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breee3,

хотелось бы понять, что значит для тебя наследование событий?
если имеется ввиду возможность вызвать то в мсдн написано: Wrap event invocations inside a protected virtual method to allow derived classes to override the event invocation behavior
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966321
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

Я понимаю, автор хочет обработать событие в производном классе, а потом остальная логика обработана была в базовом классе... типо псевдо:
Код: vbnet
1.
2.
3.
4.
5.
Public Sub AEvent(sender, e)
    'тут его код

    RaiseEvent MyBase.AEvent(sender, e) 'передаём управление базовому классу
End Sub
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966374
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

template method, наверное
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966411
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breee31) как добиться чтоб получалось подписаться на событие в экземпляре класса BМожет тут вообще событие не нужно?

Есть вот такой подход:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A
{
  void AnyFunction()
  {
    // Some logic
    // Some logic
    AfterAnyFunction()
  }
  virtual void AfterAnyFunction() { }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
class B : A
{
  override void AfterAnyFunction()
  {
    // Some logic
  }
}
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966414
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) убрать protected из
Код: c#
1.
protected virtual event EventHandler AEvent;


2) а куда он денется?
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966920
breee3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, извините, за не ясную формулировку. Да еще и код с ошибками написал, не привык на c# в блокноте..

Попытаюсь ещё раз. Есть базовый абстрактный класс. От него наследуются несколько не абстрактных.
Событие абстрактного класса я хочу вызывать из наследуемых. Хочу, чтоб сторонние классы могли подписаться на это событие. А так же чтоб в базовом классе, выполнилась некоторая логика.
Надеюсь понятно, объяснил. Никак у меня не укладывается в голове, как они наследуются. Что я не пробую получаю ошибки синтаксиса.
Я уже обошел это проблему дублированием кода в потомках.. но хотелось бы по уму.. да и вообще разобраться..
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966922
breee3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationbreee3,

хотелось бы понять, что значит для тебя наследование событий?
если имеется ввиду возможность вызвать то в мсдн написано: Wrap event invocations inside a protected virtual method to allow derived classes to override the event invocation behavior а вот это, уже похоже на решение
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966931
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breee3Событие абстрактного класса я хочу вызывать из наследуемых. Хочу, чтоб сторонние классы могли подписаться на это событие. А так же чтоб в базовом классе, выполнилась некоторая логика.

теперь гораздо понятней. Рискую получить тухлую помидорку за критику задачи вместо предложения решения, однако, на мой взгляд, автор пошел категорически неверным путем. Поясню:
1. С точки зрения S.O.L.I.D., контракт внешней коммуникации не может одновременно использоваться для внутренней коммуникации в рамках объекта. Иными словами, если событие присутствует в интерфейсе общения с внешним миром, не следует использовать это же событие для общения между базовой и производной частями класса.
2. Событийный механизм общения между базовой и производной частями вообще вызывает вопросы, так как ограничения по области видимости не могут в родителе быть более строгими, чем в наследнике (за исключением совсем экзотических случаев). Из-за этого возникает путаница с направленностью данной зависимости (не очевидно кто является инициатором, а кто потребителем). Обратная ситуация, в свою очередь, как раз очень типична, когда родитель возбуждает событие, а наследник на него подписывается.

Таким образом, я бы предложил в базовой реализации создать protected метод и в нужные моменты вызывать данный метод из наследника. Внешняя коммуникация однозначно должна организовываться отдельно.
...
Рейтинг: 0 / 0
наследование событий в C#
    #38966954
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz118Таким образом, я бы предложил в базовой реализации создать protected метод и в нужные моменты вызывать данный метод из наследника. Внешняя коммуникация однозначно должна организовываться отдельно.
+1. Классика жанра:
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
using System;
using System.ComponentModel;

namespace test
{
  class Program
  {
    static void Main()
    {
      var @base = new Base();
      @base.PropertyChanged += (s, e) => Console.WriteLine("Base.A changed");
      @base.A="foo";
      Console.WriteLine("======================");
      var derived = new Derived();
      derived.PropertyChanged += (s, e) => Console.WriteLine("Derived.A changed");
      derived.A = "bar";
      Console.WriteLine("done");
      Console.ReadKey(true);
    }
  }

  class Base: INotifyPropertyChanged
  {
    string _a;
    public string A
    {
      get { return _a; }
      set
      {
        _a = value;
        RaisePropertyChanged("A");
      }
    }

    protected virtual void RaisePropertyChanged(string propertyName)
    {
      if (PropertyChanged==null) return;
      Console.WriteLine("Base.RaisePropertyChanged");
      PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
  }

  class Derived: Base
  {
    protected override void RaisePropertyChanged(string propertyName)
    {
      Console.WriteLine("Derived.RaisePropertyChanged");
      base.RaisePropertyChanged(propertyName);
    }
  }
}


Консольный вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
Base.RaisePropertyChanged
Base.A changed
======================
Derived.RaisePropertyChanged
Base.RaisePropertyChanged
Derived.A changed
done
...
Рейтинг: 0 / 0
наследование событий в C#
    #38967226
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breee3pationbreee3,

хотелось бы понять, что значит для тебя наследование событий?
если имеется ввиду возможность вызвать то в мсдн написано: Wrap event invocations inside a protected virtual method to allow derived classes to override the event invocation behavior а вот это, уже похоже на решениеа если Вы приведенный на английском текст забьете в поиске гугла, то еще и пример кода этого решения увидите :)
...
Рейтинг: 0 / 0
наследование событий в C#
    #38976912
breee3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, спасибо.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / наследование событий в C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]