【问题标题】:Inheritance & Events继承与事件
【发布时间】:2009-03-12 18:32:36
【问题描述】:

我有一个这样定义的接口:

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 继承并覆盖 BaseClass Rip 方法。实际上,该功能应该是抽象的-但我不知道如何使用接口来做到这一点。

另外,我如何从 RipperBase 派生的类中调用基类事件处理程序?我试过这个

    RipperEventHandler handler = PreRipEvent;
    if (handler != null)
    {
        handler(this, new RipperEventArgs { Message = "Started Ripping file to CSV!" });
    }

    handler = RipProgEvent;

这个但我得到“事件只能出现在 += 或 -= 的左侧。”错误

任何帮助将不胜感激!我正在尝试使其尽可能具有可扩展性。

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    我会这样做:

        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 方法的方法,它还引发 Completed 事件处理程序。 (也许你不想这样做,我不知道)。

    如果需要,您还可以确保 Rip 方法在另一个线程上调用 RipCore 方法。

    对于事件,我在基类中创建了一个可用于引发事件的受保护方法。如果要在子类中引发事件,只需调用此方法即可。

    【讨论】:

      【解决方案2】:

      将基类中的方法声明为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
      }
      

      【讨论】:

        【解决方案3】:

        我不知道这是否有帮助,但我认为你应该用虚拟访问标记 Rip 函数,所以它可以被覆盖,

        关于事件,也许你可以尝试在基类OnPreRipEventFired()上创建一个方法,不知道,只是给个思路

        【讨论】:

          【解决方案4】:

          也许你最好创建一个 Ripper 抽象基类。

          此外,为您的事件使用 EventHandler 泛型类型,而不是声明另一种类型 (RipperEventHandler)。例如:

          event EventHandler<RipperEventArgs> OnStart;
          

          【讨论】:

          • 关于通用事件处理程序的真实性。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-30
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 2010-10-19
          相关资源
          最近更新 更多