关于子类中不能调用基类中定义的事件问题
2009-05-20 12:07
253 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public event EventHandler evt;
static void Main(string[] args)
{
Program p = new Program();
p.run();
Console.Read();
}
public void run() {
evt+=new EventHandler(Method2);
evt(null,null);
}
public void Method2(object sender, EventArgs e) {
Console.Write("1");
}
}
class p : Program
{
public p() : base() {
evt += new EventHandler(ss);
evt(null, null);//此处会出现Error The event 'ConsoleApplication1.Program.evt' can only appear on the left hand side of += or -= //(except when used from within the type 'ConsoleApplication1.Program')
}
public void ss(object sender, EventArgs e)
{ }
}
}
你要想在派生类中触发基类中的事件,直接去调用基类中的事件,这是不允许的。
如果需要在派生类中去触发事件,则可以在基类中提供触发事件的protected virtual方法,想触发事件时就在派生类中调用这个方法,在派生类在要处理这个事件时,可以不用+=来附加事件处理方法,可以直接重写基类中的这个方法(注意:派生类要用base调用基类中的方法,否则使用+= 附加的事件处理方法不会得到调用)。
如果一定要在在派生类中直接去触发的事件,那么把event关键字去掉就可以实现。应为事件是一种特殊的委托,事件的处理实际上是使用委托调用相应的方法去执行相应的操作。加与不加event关键字,对编译结果完全没有影响。
event关键字的作用
加了event关键字,那么在类的外部 只允许+=与-=操作,而其它操作是不允许的。这也是为什么会得到那个编译错误原因。这是为了防止发生诸如在类的外部执行=操作,从而导致原来附加的 方法被覆盖掉!
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public event EventHandler evt;
static void Main(string[] args)
{
Program p = new Program();
p.run();
Console.Read();
}
public void run() {
evt+=new EventHandler(Method2);
evt(null,null);
}
public void Method2(object sender, EventArgs e) {
Console.Write("1");
}
}
class p : Program
{
public p() : base() {
evt += new EventHandler(ss);
evt(null, null);//此处会出现Error The event 'ConsoleApplication1.Program.evt' can only appear on the left hand side of += or -= //(except when used from within the type 'ConsoleApplication1.Program')
}
public void ss(object sender, EventArgs e)
{ }
}
}
你要想在派生类中触发基类中的事件,直接去调用基类中的事件,这是不允许的。
如果需要在派生类中去触发事件,则可以在基类中提供触发事件的protected virtual方法,想触发事件时就在派生类中调用这个方法,在派生类在要处理这个事件时,可以不用+=来附加事件处理方法,可以直接重写基类中的这个方法(注意:派生类要用base调用基类中的方法,否则使用+= 附加的事件处理方法不会得到调用)。
如果一定要在在派生类中直接去触发的事件,那么把event关键字去掉就可以实现。应为事件是一种特殊的委托,事件的处理实际上是使用委托调用相应的方法去执行相应的操作。加与不加event关键字,对编译结果完全没有影响。
event关键字的作用
加了event关键字,那么在类的外部 只允许+=与-=操作,而其它操作是不允许的。这也是为什么会得到那个编译错误原因。这是为了防止发生诸如在类的外部执行=操作,从而导致原来附加的 方法被覆盖掉!
相关文章推荐
- 关于子类调用基类的构造函数的各种问题
- 关于ModalPopup控件不能调用CS事件代码的问题
- 关于delete一个派生类时调用基类定义的virtual destructor的问题
- c# 关于基类和子类的方法调用问题--总结
- 关于QWidget的子类调用show()方法不能显示的问题
- 关于ModalPopup控件不能调用CS事件代码的问题
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 关于C#基类和子类函数调用问题
- 关于在c#中创建用户控件后,winform应用程序在调用中无法通过点击用户控件的子控件为其自动添加事件代码的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题
- 关于子类继承父类后调用方法的问题
- 关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法
- PHP中被调用的PHP文件中有函数则调用文件里不能重复定义的问题
- Jsp页面关于BootStrap模态框和<a href onclick>事件不能同时使用,以及传参的问题
- 关于派生类构造函数与基类构造函数的调用顺序问题
- C++关于子类调用父类的构造方法的问题
- Rhyme/关于Java子类不能缩小父类方法可见性的问题
- 关于uchome页面不能被iframe调用的问题,已解决!
- c风格回调函数 vs c++风格虚基类,关于接口定义和调用的对比