我有一个定义如下的接口:
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
}我的问题是,you将如何从RipperBase继承并覆盖BaseClass Rip方法。在现实中,这个函数应该是抽象的,但是我不知道如何使用接口来实现这个功能。
此外,如何从派生自RipperBase的类调用基类事件处理程序?我试过这个
RipperEventHandler handler = PreRipEvent;
if (handler != null)
{
handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" });
}
handler = RipProgEvent;但我得到的是“事件只能出现在+=或-=的左侧”。错误
任何帮助都将不胜感激!我正试着使它尽可能的可伸缩。
发布于 2009-03-12 18:49:02
我会这样做:
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方法。
对于这些事件,我在基类中创建一个受保护的方法,该方法可用于引发事件。如果要在子类中引发事件,只需调用此方法即可。
发布于 2009-03-12 18:44:24
将基类中的方法声明为虚拟方法,如:
public virtual void Rip(FileStream stream)
{
throw new System.NotImplementedException();
}在具体的课程中:
public override void Rip(FileStream stream){}对于该事件,请在基础上执行以下操作:
protected void FireASpecificEvent(SomeClass someArguments)
{//fire event normally
}发布于 2009-03-12 18:44:53
我不知道这是否有帮助,但我认为你应该用虚拟访问来标记Rip函数,这样它就可以被覆盖,
关于这个事件,也许您可以尝试在基类OnPreRipEventFired()上创建一个方法,不知道,只是给出了一些想法
https://stackoverflow.com/questions/639911
复制相似问题