当前位置:编程学习 > C#/ASP.NET >>

为什么父类不能调用子类声明的事件?

父类中声明方法:
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不过是避免事件无任何订阅者时的指针空问题,临时乱写的,以后照书上的通用方法改正就好。

我更想解决的还是父类统一声明事件、供子类各自引发的问题。 --------------------编程问答--------------------
引用 10 楼 sp1234 的回复:
(至少在我眼里)明显错用了概念,跟不知道这个概念,其对于开发的影响会更坏一些。
只要用起来,错几次总会慢慢好起来吧?何况这些也算不得啥子深不可测的概念吧。 --------------------编程问答-------------------- 事件怎么能这么用呢,要添加事件哦。+= new。你没看到Disigner.cs里面常有的嘛。
或者使用委托来执行事件。 --------------------编程问答--------------------
引用 8 楼 wxr0323 的回复:
http://msdn.microsoft.com/zh-cn/library/hy3sefw3.aspx


上文颇有启发性,我根据它改了下,不过好像没它说的那么复杂。


//基类中声明事件和默认事件响应方法:
    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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,