[英]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.