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 class Product { public event ProductColorChangedEventHandler ColorChanged; protected virtual void OnColorChanged() { if (null != ColorChanged) ColorChanged(); } } 如果我来自这个类,并且需要在发生颜色更改时捕获通知,那么重写OnCo

假设我有一个产品类:

public class Product
{
    public event ProductColorChangedEventHandler ColorChanged;
    protected virtual void OnColorChanged()
    {
        if (null != ColorChanged)
          ColorChanged();
    }
}

如果我来自这个类,并且需要在发生颜色更改时捕获通知,那么重写
OnColorChanged
还是在我的子类构造函数中挂接事件更好?

我认为首选方法是订阅子类中的事件,如下所示:

public class SubProduct : Product
{
  public SubProduct()
  {
      ColorChanged += new ProductColorChangedEventHandler(color_changed);
  }

  private color_changed(object sender, EventArgs e)
  {
      //do stuff
  }
}

您可以重写该方法

public override OnColorChanged()
{
    //do stuff
}

当你还在设计你的应用程序时,挂钩不是正确的方法

订阅子类中的事件,是问题的干净解决方案


这里有一个很好的读物:

以上都没有。子类应该调用
base.OnColorChanged()
,并在基本调用的基础上提供自己的实现。我认为没有理由为此目的设置活动。我想到了Decorator模式。很抱歉,我的措辞可能不正确(我更新了OP),它应该说“捕获通知”而不是“获取”。换句话说,当颜色更改事件发生时,我需要在我的子类中执行一些操作。@BlueChameleon那么您的意思是“订阅”事件,或“添加事件处理程序”,而不是“捕获”或“获取”。在这种情况下,请参见
INotifyPropertyChanged
。是的,他能。他在问他是应该还是应该订阅这个活动。请注意,使用您的方法,因为您没有调用基本实现,所以现在无法调用订阅实际事件的所有事件处理程序,这就是为什么我不喜欢像这样重写该方法。