C# 使用子类参数重写方法

2024-04-15

我正在努力实现这样的目标

public abstract class BaseEvent
{
    public abstract void Dispatch(IEventHandler handler);
}

public class MyEvent : BaseEvent
{
    public override void Dispatch(IMyEventHandler handler)
    {
        handler.OnMyEvent(this);
    }
}

public interface IEventHandler
{
}

public interface IMyEventHandler : IEventHandler
{
    void OnMyEvent(MyEvent e);
}

问题是编译器抱怨说MyEvent不执行BaseEvent since Dispatch正在采取IMyEventHandler而不是IEventHandler。我不想让MyEvent.Dispatch take a IEventHandler然后将其投射到IMyEventHandler因为我希望编译时检查以确保我没有做一些愚蠢的事情,例如传递某种其他类型的事件处理程序。我找到了一个可能的解决方案(如下),但我想知道是否有更好的方法来做到这一点。

public abstract class BaseEvent<H> where H : IEventHandler
{
    public abstract void Dispatch(H handler);
}

public class MyFirstEvent<H> : BaseEvent<H> where H : IMyFirstEventHandler
{
    public override void Dispatch(H handler)
    {
        handler.OnMyFirstEvent(this);
    }
}

public interface IEventHandler
{
}

public interface IMyFirstEventHandler : IEventHandler
{
    void OnMyFirstEvent<H>(MyFirstEvent<H> e) where H : IMyFirstEventHandler;
}

谢谢,汤姆


我以前用过你的方法。

对我来说它看起来很坚固。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 使用子类参数重写方法 的相关文章

随机推荐

  • 未捕获的类型错误:angular.lowercase 不是函数

    未捕获的类型错误 angular lowercase 不是函数 我的 angularjs 应用程序中出现此错误 并且整个应用程序未运行 这是它的表现textAngular sanitize js 413 无法调试 我尝试使用与 angula
  • BASH - 使用 Loop 和 If 语句总结唯一字段中多个字段的信息

    我有以下制表符分隔的文件 A1 A1 0 0 2 1 1 1 1 1 1 1 2 1 1 1 A2 A2 0 0 2 1 1 1 1 1 1 1 1 1 1 1 A3 A3 0 0 2 2 1 1 2 2 1 1 1 1 1 1 A5 A5
  • 网站是否有可能欺骗引用标头

    显然 请求标头可以通过客户端 任何扩展 AV 防火墙 浏览器设置等进行欺骗 我的问题是 网站所有者可以吗bad com可以创建一个 iframemywidget php 我会看到一个欺骗性的引用标头good com 欺骗将由站点所有者 例如
  • NetStream.appendBytes

    我有一个连接到 Flash Media Server 的 netConnection 我正在尝试使用 Flash Player 10 1 中的新appendBytes 函数将本地FLV 文件流式传输到FMS 但是我遇到了问题 我在网上获取的
  • 如何为ubuntu创建永久“别名”? [复制]

    这个问题在这里已经有答案了 例如 如果您创建别名 alias cls clear 它一直存在 直到您终止终端会话为止 当您启动新的终端窗口时 别名不再存在 如何创建 永久 别名 该别名存在于每个终端会话中 您可以将此类别名放入 bash a
  • 查询与空字段的比较

    我的 Firestore 集合包含带有字符串字段的文档 该字段可以是null 我期望如果我查询 Collection products Where producedDate lt 2018 01 15 我将获取 生产日期 早于 2018 1
  • UITableView 滚动时重复单元格

    当我向下滚动 UITableView 时 它开始向我显示我已经看到的相同单元格 并且稍微滚动一下继续将单元格放在错误的位置 这是我正在使用的代码 如果需要任何其他信息 请告诉我 h interface HomeViewController
  • MediaStore.Playlists.Members.moveItem 的替代方案

    我一直在使用以下代码从 Android 应用程序的播放列表中删除项目 private void removeFromPlaylist long playlistId int loc ContentResolver resolver getA
  • 为什么在基于 Lisp 的语言中习惯上将许多右括号放在一行上?

    通常代码如下所示 one thing another thing arg1 f arg5 r another thing arg1 f arg5 r 为什么不喜欢这样 one thing another thing arg1 f arg5
  • 在 JQuery 中通过 AJAX 上传文件

    我是 JQuery AJAX 的新手 我想用jquery实现文件上传 是否可以使用 JQuery AJAX 进行文件上传并将其发送到 Servlet Servlet 可以使用 apache file commons 来上传文件 有人可以建议
  • Android 通知 LED 不使用我的颜色

    我正在尝试使用一个通知 该通知也使用我的 S3 上的通知 LED 但由于某种原因 颜色将始终为蓝色 我猜这是默认值 我尝试使用不同的颜色但没有任何变化 其他应用程序 例如 Whatsapp Gmail 和 Facebook 在显示不同颜色的
  • Mule 中使用日期的 JMS 消息选择器

    在 Mule 3 3 1 中 在异步处理期间 当我的任何外部服务关闭时 我想将消息放在队列中 retryQueue 具有特定的 下次重试 时间戳 处理来自此的消息的流程retryQueue根据 下次重试 时间选择消息 如果 下次重试 时间超
  • 为什么我不能将会话 bean 作为 Java EE 5 中的 JSF 支持 bean

    AFAIK JBoss Seam 的全部目的是集成 EJB 和 JSF Seam in Action 一书说道 根据设计 EJB 组件不能直接绑定到 JSF 视图 EJB 真是太棒了 组件具有可扩展性 事务性 线程安全性和安全性 但作用不大
  • 有没有办法在 venv/web 服务器中安装 Tesseract OCR?

    我制作了一个执行 OCR 功能的 Python 脚本 然后回收了该脚本并使用 Flask 制作了一个 Web 应用程序 Web 应用程序及其库位于 virtualenv 中 但该应用程序使用操作系统 Windows 中安装的 Tessera
  • load_plugin_textdomain 不起作用

    嘿 我正在尝试本地化一个名为 Donate Plus 的插件 技术上本地化 该插件附带 en CA 和 de DE 文件 我尝试创建 he IL 文件但没有成功 所以我尝试使用插件附带的 de 文件 但没有成功 我已将 wp config
  • SwiftUI:不同层次结构中的弹出框+工作表问题

    我遇到了呈现弹出框然后尝试呈现表格的问题 该表无法呈现 我准备了一个显示两个按钮的简短代码 第一个在其自身上呈现一个弹出窗口 单击此按钮 第二个呈现一张纸 然后这个按钮 重现步骤 可在 iPad 上重现 单击第一个按钮 会出现一个弹出窗口
  • 使用 jdk 8 时 Java 模态对话框冻结整个应用程序

    很少 当使用 Java Swing 应用程序显示模式对话框时JDK1 8 0 144 整个应用程序被冻结 我在 JDK bug 数据库中找不到相关的 bug 唯一看起来远程相关的是this one https bugs openjdk ja
  • 如何在 TypeScript 中定义通用对象数组,每个项目都有不同的模板参数[重复]

    这个问题在这里已经有答案了 我试图为表单定义一个字段数组 其中每个项目可能有不同的类型 我定义了这些类型 interface FormData value1 number value2 number null value3 string v
  • 如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`

    我正在使用 boost asio deadline timer 像这样在async read操作在一个TCP套接字 我在用提升1 61 long time out millis 2000 boost asio deadline timer
  • C# 使用子类参数重写方法

    我正在努力实现这样的目标 public abstract class BaseEvent public abstract void Dispatch IEventHandler handler public class MyEvent Ba