вызов события из класса наследника.
От: SP_ Украина  
Дата: 11.07.08 14:40
Оценка:
class C1
{
    public event EventHandler MyEvent;
    void F()
    {
         MyEvent(null, null); //все ОК
    }
}

class C2 : C1
{
    void F()
    {
         MyEvent(null, null); //ошибка компиляции
    }
}

Вопрос 1 : Нафига придумали это искуственное огранчение?
Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.
Re: вызов события из класса наследника.
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.07.08 14:43
Оценка: +1
Здравствуйте, SP_, Вы писали:

SP_>Вопрос 1 : Нафига придумали это искуственное огранчение?

Для инкапсуляции.

SP_>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.

Значит, разработчик класса не предназначил это событие для вызова из наследников. Попытка это обойти может привести к нарушению инвариантов. Обойти, как всегда, можно через рефлекшн.
Re[2]: вызов события из класса наследника.
От: SP_ Украина  
Дата: 11.07.08 14:53
Оценка:
Здравствуйте, nikov, Вы писали:

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


SP_>>Вопрос 1 : Нафига придумали это искуственное огранчение?

N>Для инкапсуляции.
хм, иля чего т не понимаю, почему private, protected, public не катят в этом случае?

SP_>>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.

N>Значит, разработчик класса не предназначил это событие для вызова из наследников. Попытка это обойти может привести к нарушению инвариантов. Обойти, как всегда, можно через рефлекшн.
Ну ет понятно, думал есть более красивые варианты....
Re[3]: вызов события из класса наследника.
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.07.08 15:06
Оценка: 2 (1)
Здравствуйте, SP_, Вы писали:

SP_>хм, иля чего т не понимаю, почему private, protected, public не катят в этом случае?


Эти модификаторы регулируют область, из которой можно подписаться/отписаться на событие. А вызов field-like события возможен только из определяющего его типа, потому что только там оно классифицируется как поле. Смотрите 7.5.4 Member access:

o If I identifies an instance event:
• If the reference occurs within the class or struct in which the event is declared, and the event was declared without event-accessor-declarations (§10.8), then E.I is processed exactly as if I was an instance field.
• Otherwise, the result is an event access with an associated instance expression of E.


и 7.1 Expression classifications:

• An event access. Every event access has an associated type, namely the type of the event. Furthermore, an event access may have an associated instance expression. An event access may appear as the left hand operand of the += and -= operators (§7.16.3). In any other context, an expression classified as an event access causes a compile-time error.



N>>Значит, разработчик класса не предназначил это событие для вызова из наследников. Попытка это обойти может привести к нарушению инвариантов. Обойти, как всегда, можно через рефлекшн.

SP_>Ну ет понятно, думал есть более красивые варианты....

Нет, красивые способы нарушения инкапсуляции не предусмотрены.
Re: вызов события из класса наследника.
От: Аноним  
Дата: 11.07.08 15:07
Оценка:
SP_>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.

В базовом классе напиши функцию которая вызывает событие, а не вызывай напрямую. из потомка вызвай функцию.
Re[2]: вызов события из класса наследника.
От: SP_ Украина  
Дата: 11.07.08 15:15
Оценка:
Здравствуйте, Аноним, Вы писали:



SP_>>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.


А>В базовом классе напиши функцию которая вызывает событие, а не вызывай напрямую. из потомка вызвай функцию.
Re[3]: вызов события из класса наследника.
От: Аноним  
Дата: 11.07.08 15:18
Оценка:
SP_>А>В базовом классе напиши функцию которая вызывает событие, а не вызывай напрямую. из потомка вызвай функцию.

Извините, туплю в конце рабочего дня перед выходными. Действительно — красивых способов нет
Re: вызов события из класса наследника.
От: stump http://stump-workshop.blogspot.com/
Дата: 11.07.08 16:54
Оценка:
Здравствуйте, SP_, Вы писали:

SP_>Вопрос 1 : Нафига придумали это искуственное огранчение?

уже рассказали выше...
SP_>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.
Вариантов "обхода" два:
1. Вместо event использовать делегат.
2. В базовом классе определить protected метод и в нем вызывать событие
class C1
{
    public event EventHandler MyEvent;
    protected void OnMyEvent()
    {
         MyEvent(null, null); //все ОК
    }
}

class C2 : C1
{
    void F()
    {
         OnMyEvent(null, null); 
    }
}

так собственно все и делают.
Понедельник начинается в субботу
Re[2]: вызов события из класса наследника.
От: laad  
Дата: 11.07.08 17:48
Оценка:
Здравствуйте, nikov, Вы писали:

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


SP_>>Вопрос 1 : Нафига придумали это искуственное огранчение?

N>Для инкапсуляции.

SP_>>Вопрос 2 : Как обойти? В базовом классе функции OnMyEvent нет и его изменять нельзя.

N>Значит, разработчик класса не предназначил это событие для вызова из наследников. Попытка это обойти может привести к нарушению инвариантов. Обойти, как всегда, можно через рефлекшн.

А не просветишь про нарушение инвариантов, на самом деле интересно?
Re[3]: вызов события из класса наследника.
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.07.08 18:05
Оценка: +1
Здравствуйте, laad, Вы писали:

L>А не просветишь про нарушение инвариантов, на самом деле интересно?


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