2012-01-31 72 views
0

我想使用虚拟事件&在派生类中重写它。以下是代码片断,我在声明虚拟事件时收到警告消息。带虚拟事件的警告消息

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

       namespace ConsoleApplication6 
       { 
        class Program 
        { 
         static void Main(string[] args) 
         { 
          DeriveClass obj = new DeriveClass(); 
          obj.myEvent += new EventHandler(obj_myEvent); 
          obj.MyFunction(); 

          Console.ReadLine(); 
         } 

         static void obj_myEvent(object sender, EventArgs e) 
         { 
          Console.WriteLine("Event fired....."); 
         } 
        } 

        public abstract class BaseClass 
        { 
         // I get warning on this line - Warning 1 The event 'ConsoleApplication6.BaseClass.myEvent' is never used Program.cs 
         public virtual event EventHandler myEvent; 
        } 

        public class DeriveClass : BaseClass 
        { 
         public override event EventHandler myEvent; 

         public void MyFunction() 
         { 
          if (myEvent != null) 
          { 
           myEvent(this, null); 
          } 
         } 
        } 
       } 

任何人都可以请告诉我如何解决此警告?

阿图尔Sureka

+0

您还可以在接口上声明事件并实现该接口。 – dash 2012-01-31 13:18:55

+0

@ madd0在基类中可以有许多派生类和事件集。我想根据需求重写其中的一些派生类。 – 2012-01-31 13:20:12

+0

@AtulSureka我不相信你需要虚拟事件。我会回答下面的建议。 – madd0 2012-01-31 13:27:27

回答

0

因为我不想在基类中对该事件做任何事情。解决了警告后。

public virtual event EventHandler myEvent = delegate { }; 
3

一个较为知名的模式在这种情况下使用是提供DeriveClass一个受保护的方法,以提高myEvent。例如:

public abstract class BaseClass { 

    public event EventHandler MyEvent; 

    protected virtual void OnMyEvent(EventArgs e) { 
     var local = MyEvent; 
     if (local != null) local(this, e); 
    } 
} 

public class DeriveClass : BaseClass { 

    public void MyFunction() { 

     OnMyEvent(null); 
    } 
} 

此模式将删除警告。警告的存在是因为myEvent从未在BaseClass中使用。

0

使事件不是虚拟的,并实现派生类可用来引发它的受保护方法。真的没有任何理由有虚拟活动。

public event EventHandler MyEvent; 

protected void RaiseMyEvent() 
{ 
    var myEvent = MyEvent; 
    if (myEvent != null) 
     MyEvent(EventArgs.Empty); 
} 
+0

基类中可以有许多派生类和事件集。我想根据需要重写其中的一些派生类,我认为虚拟事件最适合它 – 2012-01-31 13:35:48

+0

这解决了警告公共虚拟事件EventHandler myEvent = delegate {}; – 2012-01-31 13:42:23

+0

您正在解决错误,因为您正在强制分配给变量,但是,代码中的任何内容都不会实际激活附加的委托。我仍然不确定虚拟化事件到底是什么。事件的类型完全相同,所以你所做的只是添加了一些间接性。如果您从代码中删除所有虚拟声明和覆盖,我相信您不会看到应用程序行为的变化。 – 2012-01-31 22:14:13