2015-05-08 3 views
0

Я пытаюсь поднять события в моем абстрактном классе и моем производном классе и заставить их выйти на одно и то же событие в основном. Это возможно? С приведенным ниже кодом я установил точку останова в двух событиях повышения, и я вижу, что повышение бара, но никогда foo и фактическое событие в main никогда не вызываются из-за того, что OnDataReceived имеет значение null. Что я делаю не так? Если я попытаюсь сделать абстрактную абстракцию бара и функцию Raise Function виртуальной в баре и переопределить оба в моих производных классах, тогда я получаю сообщение об ошибке, когда OnDataReceived в баре не остается слева от + = или - =.абстрактное событие класса C#

Вот в основном то, что у меня есть:

public abstract class bar 
{ 
    public event DataReceivedHandler OnDataReceived; 

    protected void RaiseDataReceivedEvent(EventArgs e) 
    { 
     if (OnDataReceived != null) 
      OnDataReceived(this, e); 
    } 

    /// <summary> 
    /// A global event that will happen for all "bar" derived classes 
    /// </summary> 
    private void globalEvent() 
    { 
     //Raise this event for the derived class here. 
     RaiseDataReceivedEvent(new EventArgs()); 
    } 
} 

public class foo : bar 
{ 
    public foo() 
    { 

    } 

    /// <summary> 
    /// A specific event that will happen only for this derived class 
    /// </summary> 
    private void fooSpecificEvent() 
    { 
     //Raise this event for the derived class here 
     RaiseDataReceivedEvent(new EventArgs()); 
    } 
} 

public class Main 
{ 
    bar specificProduct = new foo(); 

    public Main() 
    { 
     specificProduct.OnDataReceived += specificProduct_OnDataReceived; 
    } 

    void specificProduct_OnDataReceived(object sender, IttsDataReceivedEventArgs e) 
    { 
     //Here I want to process events from both fooSpecificEvent and globalEvent calls to RaiseDataReceivedEvent 
    } 
} 
+0

Абстрактный класс содержит глобальные методы, которые будут использовать все производные классы/call. Тем не менее, я хочу, чтобы абстрактный класс манипулировал данными для глобальных методов. Событие DataReceived используется для уведомления классов потребителей при наличии новых данных. Однако, когда я нарушаю метод Raise, OnDataReceived всегда имеет значение null. – Jeremy

+0

Когда методы 'globalEvent' & 'fooSpecificEvent' вызываются? –

+0

Можете ли вы опубликовать простую «главную» программу, которая демонстрирует проблему? –

ответ

0

Так что, да ... Приведенный выше код работает. Просто убедитесь, что вызывающий объект foo такой же, как foo, который был подключен к событию. Глупая ошибка.

У меня был foo_1.OnDataReceived проводной, но foo_2 был событием вызова.

0

Вы можете изменить свой метод GlobalEvent() для защиты и просто вызовите его из Foo конкретного события. Нечто подобное:

private void fooSpecificEvent() 
{ 
    //Raise this event for the derived class here 
    RaiseDataReceivedEvent(new EventArgs()); 
    base.globalEvent(); 
} 
+0

Я не хочу, чтобы метод globalEvent вызывался из классов fooSpecific. Проблема, которую я вижу, по-видимому, сосредоточена вокруг OnDataReceivedEvent, являющейся нулевым в абстрактном классе. Однако я проверил, что specificProduct.OnDataReceived + = specificProduct_OnDataReceived; безусловно, называется. – Jeremy

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