繁体   English   中英

继承与事件

[英]Inheritance & Events

我有一个这样定义的接口:

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);

和实现该接口的基类

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
}

我的问题是如何从RipperBase继承和覆盖BaseClass的瑞普方法。 实际上,该功能应该是抽象的-但我不知道如何使用接口来实现。

另外,如何从RipperBase派生的类中调用基类事件处理程序? 我试过了

    RipperEventHandler handler = PreRipEvent;
    if (handler != null)
    {
        handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" });
    }

    handler = RipProgEvent;

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

任何帮助将不胜感激! 我正在尝试使其尽可能地可扩展。

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

public virtual void Rip(FileStream stream)
{
    throw new System.NotImplementedException();
}

并在特定类别中:

public override void Rip(FileStream stream){}

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

protected void FireASpecificEvent(SomeClass someArguments)
{//fire event normally
}

我会这样做:

    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方法的方法,它还会引发Completed事件处理程序。 (我不知道,也许您不想这样做)。

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

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

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

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

也许您最好制作一个Ripper抽象基类。

另外,对事件使用EventHandler <>通用类型,而不是声明其他类型(RipperEventHandler)。 例如:

event EventHandler<RipperEventArgs> OnStart;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM