1
    class Program
    {
       public delegate void MyDelatage();

       public event MyDelatage MyEvent;

       public Program()
       {
           MyEvent += Fun;
       }
       public void Fun()
       {
          Console.WriteLine("Base class");
       }
       public void RaiseMyEvent()
       {
          if(MyEvent != null)
                MyEvent();
           }
       }

    class Child : Program
    {
        public void Start()
        {
           //base.MyEvent();//not allowed
           RaiseMyEvent();
         }
     }

为什么我不能在子类中访问 MyEvent ?

4

2 回答 2

2

因为event是一种语法糖,涉及生成在派生类中不可见的私有字段。

于 2012-11-23T11:43:42.257 回答
0

“...当您创建一个可用作其他类的基类的类时,您必须考虑这样一个事实,即事件是一种特殊类型的委托,只能从声明它们的类中调用。派生类不能直接调用在基类中声明的事件。虽然有时您可能想要一个只能由基类引发的事件,但在大多数情况下,您应该启用派生类来调用基类事件。...“(http ://msdn.microsoft.com/en-us/library/hy3sefw3(v=vs.80).aspx )

你应该在你的基类中写这样的东西:

public event EventHandler<EventArgs> OnButtonClick;
...
protected virtual void OnReady(object sender, EventArgs e) {
    if(OnButtonClick != null) {
        OnButtonClick(sender, e);
    }
}

并在您的子类中调用此方法,即:

base.OnReady(sender, e);
于 2012-11-23T11:49:39.423 回答