2014-11-24 2 views
0

Я действительно не уверен, что еще нужно Google, чтобы попытаться найти ответ на этот вопрос, может ли кто-нибудь сказать мне правильный способ реализовать эти события? В ClassOne событие считается нулевым, и я просто не понимаю ....Каскадирование множественного наследования и событий

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace MultipleInheritance 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      ClassThree cThree = new ClassThree(); 
      cThree.fireEventOne += cThree_fireEventOne; 
      cThree.Start(); 
      cThree.Start2(); 
      cThree.Start3(); 
     } 

     static void cThree_fireEventOne() 
     { 
      Console.WriteLine("one two three"); 
     } 
    } 
} 

и здесь классы

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace MultipleInheritance 
{ 
    public abstract class ClassOne 
    { 
     public delegate void EventOne(); 
     public event EventOne fireEventOne; 

     public ClassOne() 
     { 

     } 

     public void Start() 
     { 
      fireEventOne(); 
     } 

     public abstract void Start2(); 
    } 

    public abstract class ClassTwo :ClassOne 
    { 
     public delegate void EventOne(); 
     public event EventOne fireEventOne; 

     public override void Start2() 
     { 
      fireEventOne(); 
     } 

     public abstract void Start3(); 
    } 

    public class ClassThree :ClassTwo 
    { 
     public delegate void EventOne(); 
     public event EventOne fireEventOne; 

     public override void Start3() 
     { 
      fireEventOne(); 
     } 
    } 
} 
+0

Также обратите внимание, что C# на самом деле не имеет множественного наследования, которое наследует класс от более чем одного класса на том же уровне, что-то вроде «Ребенок: мать, отец». То, что вы делаете, - это просто стандартное наследование. Это только «несколько» в том смысле, что у вас есть несколько потомков, но не совсем корректно называть его «множественным». –

+0

ah, i c, thanks =] –

ответ

3

Проблема заключается в том, что вы переопределение следующее каждый класс:

public delegate void EventOne(); 
public event EventOne fireEventOne; 

Так что, когда вы звоните Start() вы пытаетесь стрелять событие fireEventOne в классе ClassOne, но вы подключили слежка события в ClassThree как это:

cThree.fireEventOne += cThree_fireEventOne; 

Я могу понять, почему вы закодированы это таким образом. Вы получаете ошибку компилятора при попытке напрямую вызвать событие из родительского класса. Правильный способ - предоставить метод protected, который вы вызываете в родительском классе для запуска события.

Попробуйте писать свои классы, как это:

public abstract class ClassOne 
{ 
    public delegate void EventOne(); 
    public event EventOne fireEventOne; 

    public ClassOne() 
    { } 

    public void Start() 
    { 
     this.DoFireEventOne(); 
    } 

    protected void DoFireEventOne() 
    { 
     var feo = fireEventOne; 
     if (feo != null) 
     { 
      feo(); 
     } 
    } 

    public abstract void Start2(); 
} 

public abstract class ClassTwo :ClassOne 
{ 
    public override void Start2() 
    { 
     this.DoFireEventOne(); 
    } 

    public abstract void Start3(); 
} 

public class ClassThree :ClassTwo 
{ 
    public override void Start3() 
    { 
     this.DoFireEventOne(); 
    } 
} 
+0

Рок-н-ролл, спасибо! –

1

Вы создаете событие fireEventOne в каждом классе. Итак, у вас есть три события. Но метод fireEventOne реализуется на первом уровне (ClassOne). Таким образом, он поднимет делегата класса ClassOne. Удалите событие fireEventOne для классов потомков.

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