2012-01-31 71 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