паттерн события
От: andreich78 Россия  
Дата: 25.04.05 07:04
Оценка:
народ, объясните тупому, почему для событий в .NET выбран именно паттерн void MethodName(object, EventArgs)?
понятно, почему может понадобиться sender, понятно, зачем может понадобиться EventArgs, не понятно почему не передать всё это как object[].
паттерн события
От: Аноним  
Дата: 25.04.05 07:13
Оценка:
Потому что так было в Delphi..
Deny everything...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: паттерн события
От: Oyster Украина https://github.com/devoyster
Дата: 25.04.05 07:19
Оценка:
Здравствуйте, andreich78, Вы писали:

A>народ, объясните тупому, почему для событий в .NET выбран именно паттерн void MethodName(object, EventArgs)?

A>понятно, почему может понадобиться sender, понятно, зачем может понадобиться EventArgs, не понятно почему не передать всё это как object[].

Можно ещё посмотреть на паттерн возбуждения события "снаружи": void MethodName(EventArgs). Ну а внутри как sender просто добавляется this.

Ну и строгая типизация, конечно (обработчик знает, что EventArgs — это EventArgs).
Re[2]: паттерн события
От: andreich78 Россия  
Дата: 25.04.05 07:38
Оценка:
O>Можно ещё посмотреть на паттерн возбуждения события "снаружи": void MethodName(EventArgs). Ну а внутри как sender просто добавляется this.

O>Ну и строгая типизация, конечно (обработчик знает, что EventArgs — это EventArgs).


хм, то есть это возможность вызвать событие снаружи класса, не давая изменить источник события. интересно...
но строгая типизация почему-то нарушена в части "object sender" — зачем это понадобилось наполовину следить за типами, а наполовину не следить, можно было сделать и "object e" вместо "EventArgs e"?
Re[3]: паттерн события
От: Oyster Украина https://github.com/devoyster
Дата: 25.04.05 07:46
Оценка:
Здравствуйте, andreich78, Вы писали:

A>хм, то есть это возможность вызвать событие снаружи класса, не давая изменить источник события. интересно...

A>но строгая типизация почему-то нарушена в части "object sender" — зачем это понадобилось наполовину следить за типами, а наполовину не следить, можно было сделать и "object e" вместо "EventArgs e"?

ИМХО идея в том, что совершенно разные классы могут публиковать одни и те же события (например, какие-нибудь воображаемые MyCustomButton и StandardButton публикуют событие Click). В таком случае sender не всегда может бытть конкретизирован (да это часто и не нужно), а какой-нибудь ClickEventArgs очень даже полезно конкретизировать (для удобства пользователя события — чаще нам нужны именно аргументы, т.к. сендера мы и так знаем, когда подписываемся).

Путанно объяснил, наверное... как смог
Re[4]: паттерн события
От: andreich78 Россия  
Дата: 25.04.05 08:12
Оценка:
O>ИМХО идея в том, что совершенно разные классы могут публиковать одни и те же события (например, какие-нибудь воображаемые MyCustomButton и StandardButton публикуют событие Click). В таком случае sender не всегда может бытть конкретизирован (да это часто и не нужно), а какой-нибудь ClickEventArgs очень даже полезно конкретизировать (для удобства пользователя события — чаще нам нужны именно аргументы, т.к. сендера мы и так знаем, когда подписываемся).

O>Путанно объяснил, наверное... как смог

получается, что наследоваться от EventArgs необязательно, разве нет?
просто передавать аргумент того же типа...
Re[5]: паттерн события
От: Oyster Украина https://github.com/devoyster
Дата: 25.04.05 08:16
Оценка:
Здравствуйте, andreich78, Вы писали:

O>>ИМХО идея в том, что совершенно разные классы могут публиковать одни и те же события (например, какие-нибудь воображаемые MyCustomButton и StandardButton публикуют событие Click). В таком случае sender не всегда может бытть конкретизирован (да это часто и не нужно), а какой-нибудь ClickEventArgs очень даже полезно конкретизировать (для удобства пользователя события — чаще нам нужны именно аргументы, т.к. сендера мы и так знаем, когда подписываемся).


O>>Путанно объяснил, наверное... как смог

A>получается, что наследоваться от EventArgs необязательно, разве нет?
A>просто передавать аргумент того же типа...

По-моему как раз обязательно (для удобства пользователя), но только в случае если твой event предоставляет какие-нибудь event arguments. Тогда делегат для Click event будет выглядеть как void ClickDelegate(object sender, ClickEventArgs e). Пользователь получит именно ClickEventArgs. Ещё раз повторюсь, что моё ИМХО в том, что сделано было так для удобства подписчика события.
Re[6]: паттерн события
От: Andrbig  
Дата: 25.04.05 08:34
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, andreich78, Вы писали:


O>>>ИМХО идея в том, что совершенно разные классы могут публиковать одни и те же события (например, какие-нибудь воображаемые MyCustomButton и StandardButton публикуют событие Click). В таком случае sender не всегда может бытть конкретизирован (да это часто и не нужно), а какой-нибудь ClickEventArgs очень даже полезно конкретизировать (для удобства пользователя события — чаще нам нужны именно аргументы, т.к. сендера мы и так знаем, когда подписываемся).


O>>>Путанно объяснил, наверное... как смог

A>>получается, что наследоваться от EventArgs необязательно, разве нет?
A>>просто передавать аргумент того же типа...

O>По-моему как раз обязательно (для удобства пользователя), но только в случае если твой event предоставляет какие-нибудь event arguments. Тогда делегат для Click event будет выглядеть как void ClickDelegate(object sender, ClickEventArgs e). Пользователь получит именно ClickEventArgs. Ещё раз повторюсь, что моё ИМХО в том, что сделано было так для удобства подписчика события.


Мне кажется, andreich78 спрашивал немного другое: обязательно ли в void ClickDelegate(object sender, ClickEventArgs e) наследовать ClickEventArgs именно от EventArgs? Ведь ничего не мешает отнаследовать его от кого угодно, хоть от Rectangle — это не повлияет ни на делегат, ни на строгую типизацию, все это будет...
Re[7]: паттерн события
От: Chupa_Kabra  
Дата: 25.04.05 09:06
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Oyster, Вы писали:


O>>Здравствуйте, andreich78, Вы писали:


O>>>>ИМХО идея в том, что совершенно разные классы могут публиковать одни и те же события (например, какие-нибудь воображаемые MyCustomButton и StandardButton публикуют событие Click). В таком случае sender не всегда может бытть конкретизирован (да это часто и не нужно), а какой-нибудь ClickEventArgs очень даже полезно конкретизировать (для удобства пользователя события — чаще нам нужны именно аргументы, т.к. сендера мы и так знаем, когда подписываемся).


O>>>>Путанно объяснил, наверное... как смог

A>>>получается, что наследоваться от EventArgs необязательно, разве нет?
A>>>просто передавать аргумент того же типа...

O>>По-моему как раз обязательно (для удобства пользователя), но только в случае если твой event предоставляет какие-нибудь event arguments. Тогда делегат для Click event будет выглядеть как void ClickDelegate(object sender, ClickEventArgs e). Пользователь получит именно ClickEventArgs. Ещё раз повторюсь, что моё ИМХО в том, что сделано было так для удобства подписчика события.


A>Мне кажется, andreich78 спрашивал немного другое: обязательно ли в void ClickDelegate(object sender, ClickEventArgs e) наследовать ClickEventArgs именно от EventArgs? Ведь ничего не мешает отнаследовать его от кого угодно, хоть от Rectangle — это не повлияет ни на делегат, ни на строгую типизацию, все это будет...

А в качестве исключения можно использовать тип int, он тоже не отнаследован от Exception, только, слава богу, ни кто это не делает.
Все хотят хорошо провести время, но время не проведешь !
Re[7]: паттерн события
От: Oyster Украина https://github.com/devoyster
Дата: 25.04.05 09:11
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Мне кажется, andreich78 спрашивал немного другое: обязательно ли в void ClickDelegate(object sender, ClickEventArgs e) наследовать ClickEventArgs именно от EventArgs? Ведь ничего не мешает отнаследовать его от кого угодно, хоть от Rectangle — это не повлияет ни на делегат, ни на строгую типизацию, все это будет...


Естественно, сам разработчик волен писать так, как ему захочется... использование EventArgs в качестве парента это своего рода договорённость.
Re[8]: паттерн события
От: Andrbig  
Дата: 25.04.05 09:24
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Andrbig, Вы писали:


A>>Мне кажется, andreich78 спрашивал немного другое: обязательно ли в void ClickDelegate(object sender, ClickEventArgs e) наследовать ClickEventArgs именно от EventArgs? Ведь ничего не мешает отнаследовать его от кого угодно, хоть от Rectangle — это не повлияет ни на делегат, ни на строгую типизацию, все это будет...


O>Естественно, сам разработчик волен писать так, как ему захочется... использование EventArgs в качестве парента это своего рода договорённость.


Хм, а в чем мотивы такой договоренности?
Re[9]: паттерн события
От: Oyster Украина https://github.com/devoyster
Дата: 25.04.05 09:37
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Oyster, Вы писали:


O>>Здравствуйте, Andrbig, Вы писали:


A>>>Мне кажется, andreich78 спрашивал немного другое: обязательно ли в void ClickDelegate(object sender, ClickEventArgs e) наследовать ClickEventArgs именно от EventArgs? Ведь ничего не мешает отнаследовать его от кого угодно, хоть от Rectangle — это не повлияет ни на делегат, ни на строгую типизацию, все это будет...


O>>Естественно, сам разработчик волен писать так, как ему захочется... использование EventArgs в качестве парента это своего рода договорённость.


A>Хм, а в чем мотивы такой договоренности?


Тут моих знаний не хватает Нужен был какой-то базовый класс для аргументов событий... почему это не object? Ну может из-за EventArgs.Empty?

А вообще вот цитата из MSDN и я умываю руки :

.NET Framework Guidelines

Although the C# language allows events to use any delegate type, the .NET Framework has some stricter guidelines on the delegate types that should be used for events. If you intend for your component to be used with the .NET Framework, you probably will want to follow these guidelines.

The .NET Framework guidelines indicate that the delegate type used for an event should take two parameters, an "object source" parameter indicating the source of the event, and an "e" parameter that encapsulates any additional information about the event. The type of the "e" parameter should derive from the EventArgs class. For events that do not use any additional information, the .NET Framework has already defined an appropriate delegate type: EventHandler.

Re[10]: паттерн события
От: andreich78 Россия  
Дата: 25.04.05 11:36
Оценка:
O>А вообще вот цитата из MSDN и я умываю руки :

O>[q]

O>.NET Framework Guidelines

спасибо за участие, поищу дальше...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.