代码之家  ›  专栏  ›  技术社区  ›  Michal Czardybon

在C中,事件重定向是一个好的实践吗?如果是,谁应该是“发送者”?

  •  2
  • Michal Czardybon  · 技术社区  · 17 年前

    我现在正在重构由其他人编写的代码,我发现了一个我有着复杂感觉的构造。有一个 类似于ListView的控件 和它的每一个 项目 无法引发“DialogOpened”事件。但是,向每个项注册外部事件处理程序可能会比较麻烦(这些项可以动态添加或删除!)。因此,ListView类控件中只有一个事件,名为“itemDialogOpened”。这听起来对我来说很合理,但有两个问题:

    1. 在ListView中有一个方法“OnitemDialogOpened”,类似于引发单个事件的控件,但不直接调用此方法。相反,它注册为每个项的“dialogopened”事件的事件处理程序。这样行吗?我在问,因为我在MSDN中找不到类似的东西。
    2. 如果这样的事件重定向正常,那么谁应该是最后一个单一事件的发送者?现在,在我使用的代码中,它是原始发送者——项目。但是,我认为(但我不确定),现在应该将发送者更改为类似于ListView的控件。我说的对吗?
    2 回复  |  直到 17 年前
        1
  •  1
  •   arbiter    17 年前

    对于1:这种方法不完全符合标准的流程模式。从我的观点来看,您必须在私有方法中隐藏自己的实现逻辑(此方法将是每个项的终点 对话框打开 事件),然后此方法将调用受保护的虚拟方法 Onitem对话框已打开 . 在这种情况下,ListView可以被继承,通信逻辑将是透明的,更像MS,订阅者将在不进行强制转换的情况下工作(因为强制转换隐藏在您的私有方法中)。就像这样:

    private void DialogOpenedHandler(object sender, EventArgs e)
    {
        OnItemDialogOpened(new ItemEventArgs((YourItemClass)sender);
    }
    
    protected virtual OnItemDialogOpened(ItemEventArgs e)
    {
        // call event here 
    }
    
        2
  •  3
  •   Marc Gravell    17 年前

    对于2 -它是一个 小的 有利于解释。 一般来说 你会预料到 sender 是您订阅的内容;任何其他信息都应通过 args -但也有例外,其中(例如)单个项目作为 发件人 .

    重要的是要清楚地记录下来。