Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承及;事件_C#_Oop - Fatal编程技术网

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。