我想使用虚拟事件&在派生类中覆盖它。以下是代码片段,我在声明虚拟事件时收到警告消息。
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);
}
}
}
}
有人可以告诉我如何解决此警告吗?
Atul Sureka
答案 0 :(得分: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
。
答案 1 :(得分:0)
使事件非虚拟化并实现派生类可用于引发它的受保护方法。没有任何理由可以举办虚拟活动。
public event EventHandler MyEvent;
protected void RaiseMyEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
MyEvent(EventArgs.Empty);
}
答案 2 :(得分:0)
因为我不想在基类中对该事件做任何事情。以下解决了警告。
public virtual event EventHandler myEvent = delegate { };