为什么父类不能调用子类声明的事件?
父类中声明方法:class base{
public static event reportprogressdel reportprogress = new reportprogressdel(reportprogressdefault);
子类中调用:
class child:base{
reportprogress(null, new progresseventargs(timer, lineindex));
错误如下:
error CS0070: The event 'base.reportprogress' can only appear on the left hand side of += or -= (except when used from within the type 'base')
如果把事件的声明移到子类中就可以。 --------------------编程问答-------------------- 面向对象的基本思想,继承关系的 --------------------编程问答-------------------- 事件只能用+= -+
new肯定不行..除非是委托而非事件 --------------------编程问答-------------------- 我看错了.. --------------------编程问答-------------------- 代码不全额,看不明白。
建议看下
http://msdn.microsoft.com/zh-cn/downloads/033kfe9y%28VS.90%29.aspx --------------------编程问答-------------------- Father类的外部(即在Mother.Noop()中)直接raise了Father.myevent事件,这是语法规则所不允许的。而在Father.Noop()中触发Father.myevent就是合法的。
public class Mother
{
public void Noop()
{
Father father=new Father();
father.myevent(null,null); //illegal
}
}
public class Father
{
public event System.EventHandler myevent;
public void Noop()
{
this.myevent(null,null); // correct
}
}
--------------------编程问答-------------------- 我并没有在类外部raise事件,而是在子类中,也不可以么?有说乎?
有人回复了我的帖子,竟然没发现。用《Csdn收音机》告别烦恼! --------------------编程问答-------------------- --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/hy3sefw3.aspx --------------------编程问答-------------------- 你直接在父类中声明一个方法调用 reportprogressdefault 方法,这不就行了嘛,写事件代码不是画蛇添足了嘛!
子类中直接调用继承了的那个方法就行了(而不直接调用reportprogressdefault)。 --------------------编程问答-------------------- (至少在我眼里)明显错用了概念,跟不知道这个概念,其对于开发的影响会更坏一些。 --------------------编程问答-------------------- 你可以打开.net类库中的各种客户端组件,几乎不可能会看到lz这类代码。假设一个控件要处理一个内部操作,同时要通知自己的客户这个操作事件发生了,它绝对不会把自己的处理代码注册到自己的事件上。它在触发这个事件之前或者之后,直接调用自己的处理操作代码就行了。
这其实也是一个.net框架里的设计模式,因为重复了上千次,都是一致的风格。 --------------------编程问答-------------------- 这不是重点。
这里的reportprogressdefault不过是避免事件无任何订阅者时的指针空问题,临时乱写的,以后照书上的通用方法改正就好。
我更想解决的还是父类统一声明事件、供子类各自引发的问题。 --------------------编程问答-------------------- 只要用起来,错几次总会慢慢好起来吧?何况这些也算不得啥子深不可测的概念吧。 --------------------编程问答-------------------- 事件怎么能这么用呢,要添加事件哦。+= new。你没看到Disigner.cs里面常有的嘛。
或者使用委托来执行事件。 --------------------编程问答--------------------
上文颇有启发性,我根据它改了下,不过好像没它说的那么复杂。
//基类中声明事件和默认事件响应方法:
class Shape{
public event EventHandler<progresseventargs> reportprogress;
protected virtual void onreportprogress(progresseventargs e){
EventHandler<progresseventargs> handler = reportprogress;
if (handler != null){
handler(this,e);
}
}
//派生类中直接作如下调用即可,好像不用象上文中写的那么麻烦呢:
class Circle:Shape{
onreportprogress(new progresseventargs(0,lineindex));
//事件参数类
public class progresseventargs:EventArgs{
public int lineindex;
public int time;
public progresseventargs(int timer,int lineindex){
this.time = timer;
this.lineindex = lineindex;
}
}
--------------------编程问答-------------------- 继承不明白了?
是子类继承父类的非private 方法和属性
补充:.NET技术 , C#