C# 继承及;事件
我有一个定义如下的接口:C# 继承及;事件,c#,oop,C#,Oop,我有一个定义如下的接口: public interface IRipper { IRipperHost Host { get; set; } void Rip(FileStream stream); event RipperEventHandler OnStart; event RipperEventHandler OnComplete; event RipperEventHandler OnProgressChanged; } pu
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并重写基类Rip方法。实际上,这个函数应该是抽象的——但我不知道如何使用接口来实现
另外,如何从RipperBase派生的类调用基类事件处理程序?我试过这个
RipperEventHandler handler = PreRipEvent;
if (handler != null)
{
handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" });
}
handler = RipProgEvent;
但我得到的是“事件只能出现在+=或-=”错误的左侧
任何帮助都将不胜感激!我正在努力使它尽可能可扩展 将基类中的方法声明为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
}
我不知道这是否有帮助,但我认为你应该用虚拟访问标记Rip函数,这样它就可以被覆盖
关于这个事件,也许你可以尝试在基类OnPreRipEventFired()上创建一个方法,不知道,只是给出一些想法我会这样做:
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:IRipper
{
公共无效Rip(文件流fs)
{
堆芯(fs);
未完成();
}
受保护的抽象空RipCore(Filestream fs);
公共事件事件处理程序已完成;
未完成的保护空隙
{
如果(已完成!=null)
{
//TODO:确保线程安全。
已完成(此,新裂土器文塔(…);
}
}
}
我已经将该类声明为抽象类,因为我假设您无法从RipperBase实例化对象
从RipperBase继承的类必须重写RipCore方法,并实现正确的功能。
Rip是调用RipCore方法的方法,它还引发完成的eventhandler。(也许你不想这么做,我不知道)
如果需要,还可以确保Rip方法在另一个线程上调用RipCore方法
对于事件,我在基类中创建了一个受保护的方法,可用于引发事件。如果您想在子类中引发事件,只需调用此方法。也许您最好创建一个Ripper抽象基类 另外,对事件使用EventHandler泛型类型,而不是声明另一种类型(RipperEventHandler)。例如:
event EventHandler<RipperEventArgs> OnStart;
事件事件处理程序启动;
true关于通用eventhandler。