2009-07-07 5 views
0

У меня есть интерфейс с несколькими событиями
У меня есть база класс, реализующий интерфейс
У меня есть третий класс расширения базового класса (назовем его theConcreteClass)C# - События и интерфейсы

Проблема: когда я делаю что-то вроде: IMyInterface i = new theConcreteClass(), а затем я подписался на любое из событий (i.someEvent + = some_handler;) обработчики событий никогда не вызываются, потому что (вероятно) подписка на события была назначена базовому классу, а не конкретному классу, даже если оператор new() создал конкретный класс.

надеюсь, что было ясно :)
любые предложения?

спасибо,
Adi Барда

+1

Пожалуйста, разместите небольшой пример, демонстрирующий вашу проблему, чтобы мы могли помочь - спасибо! –

+3

Я не вижу проблем в том, что вы описываете. Как вы инициируете свои события? Не могли бы вы показать нам пример кода? – sisve

ответ

6

То, что вы описываете должны работы, как и ожидалось.

Вы объявили события снова в конкретном классе, скрывающем базовые реализации?

Ваш код должен быть:

public interface IInterface 
{ 
    event EventHandler TestEvent; 
} 

public class Base : IInterface 
{ 
    public event EventHandler TestEvent; 
} 

public class Concrete : Base 
{ 
    //Nothing needed here 
} 

Чтобы ответить на ваш комментарий:

Стандартная практика поместить метод в базовом классе:

public class Base : IInterface 
{ 
    public event EventHandler TestEvent; 

    protected virtual void OnTestEvent() 
    { 
     if (TestEvent != null) 
     { 
      TextEvent(this, EventArgs.Empty); 
     } 
    } 
} 

public class Concrete : Base 
{ 
    public void SomethingHappened() 
    { 
     OnTestEvent(); 
    } 
} 

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

+0

, но как я могу вызвать событие из конкретного класса? –

+0

this.TestEvent() или base.TestEvent() - независимо от ваших потребностей. –

+0

@Adi, вы можете инициировать событие только из класса, который его объявил. Вот почему многие реализации предоставляют защищенный метод (доступный только от тех, кто наследует) с именем OnEventName, который инициирует событие с аргументами событий. – sisve

Смежные вопросы