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;