首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承与事件

继承与事件
EN

Stack Overflow用户
提问于 2009-03-12 18:32:36
回答 4查看 749关注 0票数 0

我有一个定义如下的接口:

代码语言:javascript
复制
public interface IRipper
{
    IRipperHost Host { get; set; }

    void Rip(FileStream stream);

    event RipperEventHandler OnStart;
    event RipperEventHandler OnComplete;
    event RipperEventHandler OnProgressChanged;        
}

public delegate void RipperEventHandler(object sender, RipperEventArgs e);

以及实现该接口的基类。

代码语言:javascript
复制
public class RipperBase : IRipper
{

    public void Rip(FileStream stream)
    {
        throw new System.NotImplementedException();
    }
    public event RipperEventHandler PostRipEvent;
    event RipperEventHandler IRipper.OnComplete
    {
        add
        {
            if (PostRipEvent != null)
            {
                lock (PostRipEvent)
                {
                    PostRipEvent += value;
                }
            }
            else
            {
                PostRipEvent = value;
            }
        }
        remove
        {
            if (PostRipEvent != null)
            {
                lock (PostRipEvent)
                {
                    PostRipEvent -= value;
                }
            }
        }
    }
    ... and so on
}

我的问题是,you将如何从RipperBase继承并覆盖BaseClass Rip方法。在现实中,这个函数应该是抽象的,但是我不知道如何使用接口来实现这个功能。

此外,如何从派生自RipperBase的类调用基类事件处理程序?我试过这个

代码语言:javascript
复制
    RipperEventHandler handler = PreRipEvent;
    if (handler != null)
    {
        handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" });
    }

    handler = RipProgEvent;

但我得到的是“事件只能出现在+=或-=的左侧”。错误

任何帮助都将不胜感激!我正试着使它尽可能的可伸缩。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-12 18:49:02

我会这样做:

代码语言:javascript
复制
    public abstract class RipperBase : IRipper
    {
        public void Rip( Filestream fs )
        {
             RipCore (fs);
             OnCompleted();
        }

        protected abstract void RipCore(Filestream fs);

        public event EventHandler<RipperEventArgs> Completed;

        protected void OnCompleted
        {
           if( Completed != null )
           {
               // TODO: make this Threadsafe.
               Completed (this, new RipperEventArgs( ... ) );
           }
        }
}

我已经将类声明为抽象类,因为我假定您不能从RipperBase实例化对象?

继承自RipperBase的类必须重写RipCore方法,并实现正确的功能。Rip是调用RipCore方法的方法,它还会引发已完成的均衡器。(也许你不想这么做,我不知道)。

如果需要,还可以确保Rip方法在另一个线程上调用RipCore方法。

对于这些事件,我在基类中创建一个受保护的方法,该方法可用于引发事件。如果要在子类中引发事件,只需调用此方法即可。

票数 1
EN

Stack Overflow用户

发布于 2009-03-12 18:44:24

将基类中的方法声明为虚拟方法,如:

代码语言:javascript
复制
public virtual void Rip(FileStream stream)
{
    throw new System.NotImplementedException();
}

在具体的课程中:

代码语言:javascript
复制
public override void Rip(FileStream stream){}

对于该事件,请在基础上执行以下操作:

代码语言:javascript
复制
protected void FireASpecificEvent(SomeClass someArguments)
{//fire event normally
}
票数 1
EN

Stack Overflow用户

发布于 2009-03-12 18:44:53

我不知道这是否有帮助,但我认为你应该用虚拟访问来标记Rip函数,这样它就可以被覆盖,

关于这个事件,也许您可以尝试在基类OnPreRipEventFired()上创建一个方法,不知道,只是给出了一些想法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/639911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档