inheritance与事件
我有一个如此定义的接口:
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 }
我的问题是你将如何从RipperBaseinheritance并覆盖BaseClass Rip方法。 实际上,该function应该是抽象的 – 但我不知道如何使用接口。
我怎样才能从RipperBase派生的类中调用基类事件处理程序? 我试过这个
RipperEventHandler handler = PreRipEvent; if (handler != null) { handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" }); } handler = RipProgEvent;
这个,但我得到的“事件只能出现在+ =或 – =的左侧”。 错误
任何帮助将不胜感激! 我试图尽可能地扩展它。
我会这样做:
public abstract class RipperBase : IRipper { public void Rip( Filestream fs ) { RipCore (fs); OnCompleted(); } protected abstract void RipCore(Filestream fs); public event EventHandler Completed; protected void OnCompleted { if( Completed != null ) { // TODO: make this Threadsafe. Completed (this, new RipperEventArgs( ... ) ); } } }
我已经将该类声明为抽象类,因为我认为你无法从RipperBase实例化对象?
从RipperBaseinheritance的类必须覆盖RipCore方法,并实现正确的function。 Rip是调用RipCore方法的方法,它还引发了Completed事件处理程序。 (也许你不想这样做,我不知道)。
如果需要,您还可以确保Rip方法在另一个线程上调用RipCore方法。
对于事件,我在基类中创建一个可用于引发事件的受保护方法。 如果要在子类中引发事件,只需调用此方法即可。
将基类中的方法声明为virtual,如:
public virtual void Rip(FileStream stream) { throw new System.NotImplementedException(); }
并在特定的类:
public override void Rip(FileStream stream){}
对于该事件,请在基础上执行此操作:
protected void FireASpecificEvent(SomeClass someArguments) {//fire event normally }
我不知道这是否有用,但我认为你应该用虚拟访问标记Ripfunction,所以它可以覆盖,
关于这个事件,也许你可以尝试在基类OnPreRipEventFired()上创建一个方法,不知道,只是给出了想法
也许你最好做一个Ripper抽象基类。
此外,对事件使用EventHandler <>泛型类型,而不是声明另一种类型(RipperEventHandler)。 例如:
event EventHandler OnStart;