【问题标题】:Use override instead of event subscription in a class在类中使用覆盖而不是事件订阅
【发布时间】:2016-04-28 09:47:55
【问题描述】:

目前我正在努力,是否覆盖现有方法,例如OnActivate,而不是在同一类中订阅event

例如我有以下类,它实现了一个事件:

public class Base
{
    public delegate void DoSomeThing(object sender, EventArgs e);

    public event DoSomeThing DoSomeThingEventHandler;

    public virtual void OnDoSomeThing(EventArgs e)
    {
        if (DoSomeThingEventHandler != null)
        {
            DoSomeThingEventHandler(this, e);
        }
    }
}

我有一个派生自Base 的类,如果DoSomeThing 被调用,它希望得到通知。我应该覆盖DoSomeThing 还是应该订阅该事件:

解决方案一:

public class B1 : Base
{
    public override void OnDoSomeThing(EventArgs e)
    {
        // Do some stuff here

        base.OnDoSomeThing(e);
    }
}

第二个解决方案

public class B2 : Base
{
    public B2()
    {
        DoSomeThingEventHandler += B2_DoSomeThingEventHandler;
    }

    private void B2_DoSomeThingEventHandler(object sender, EventArgs e)
    {
        // Do some thing here
    }
}

您更喜欢B1 还是B2 解决方案?

谢谢大家!

【问题讨论】:

  • 你必须覆盖事件

标签: c# .net oop events overriding


【解决方案1】:

在这种情况下,覆盖是一个更好的选择,但首先执行基类实现,这样您就不会破坏任何东西,然后在派生类中执行您想要的任何操作,例如:

public override void OnDoSomeThing(EventArgs e)
{

  base.OnDoSomeThing(e);

  // write here whatever needed

}

【讨论】:

  • 好吧,把它放在顶部是有道理的。当我想避免调用任何事件时,可能只需要一些if-statements...
  • 是的,在调用 base 之后,您可以为派生类型编写任何业务逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多