在 Scala 中重载通用事件处理程序

2023-11-23

如果我定义以下通用事件处理程序

trait Handles[E <: Event] {
  def handle(event: E)
}

事件类型如下

trait Event {

}
class InventoryItemDeactivated(val id: UUID) extends Event;

class InventoryItemCreated(val id: UUID, val name: String) extends Event;

然后我如何创建一个类来为每个事件实现事件处理程序?我试过:

class InventoryListView extends Handles[InventoryItemCreated] with Handles[InventoryItemDeactivated] {
    def handle(event: InventoryItemCreated) = {

    }

    def handle(event: InventoryItemDeactivated) = {

    }
  }

但 Scala 抱怨一个特质不能被继承两次。

我找到了这个answer这暗示了一个解决方案,但它似乎需要多个类(每个处理程序一个)。这真的是唯一的方法还是有其他一些 Scala 构造可以用来让单个类实现多个通用事件处理程序(即使用案例类、清单或其他一些奇特的构造)?


我不知道有什么方法可以在一堂课上做到这一点(除了通过Event一个 ADT 和定义句柄来接受类型的参数Event。但这会剥夺您似乎正在寻找的类型安全性)。

我建议改用类型类模式。

trait Handles[-A, -E <: Event] {
  def handle(a: A, event: E)
}

trait Event {
  ...
}
class InventoryItemDeactivation(val id: UUID) extends Event
class InventoryItemCreation(val id: UUID, val name: String) extends Event

class InventoryListView {
  ...
}

implicit object InventoryListViewHandlesItemCreation extends 
    Handles[InventoryListView, InventoryItemCreation] = {
  def handle(v: InventoryListView, e: InventoryItemCreation) = {
    ...
  }
}

implicit object InventoryListViewHandlesItemDeactivation extends 
    Handles[InventoryListView, InventoryItemDeactivation] = {
  def handle(v: InventoryListView, e: InventoryItemDeactivation) = {
    ...
  }
}

def someMethod[A, E <: Event](a: A, e: E)
              (implicit ev: InventoryListView Handles InventoryItemCreation) = {
  ev.handle(a, e)
  ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Scala 中重载通用事件处理程序 的相关文章

随机推荐

  • SQL Server 数据库 AND 视图中的表数量是否有限制?

    我正在使用 SQL Server 标准版上的数据库 每天加载数据 性能SQLBulkInsert随着表的增长和索引 I O 的启动 速度会减慢 即使禁用 重建 速度也会变慢 因此 我建议的另一种选择是创建一个引用每个每日表 例如最后 30
  • ValueError:字典更新序列元素#0的长度为1;需要 2 个

    我回来了5对于我的计算领域old default code 并且我收到以下错误 ValueError 字典更新序列元素 0的长度为1 需要 2 个 我究竟做错了什么 该函数的Python代码 def old default code sel
  • 从 bean 强制关闭 Spring 的最佳方法?

    我的应用程序使用 SpringDefaultMessageListenerContainer处理传入的消息 应用程序的 main 方法已经注册了一个关闭钩子 问题是 强制关闭应用程序上下文的最佳方法是什么 如果我扔一个RuntimeExce
  • 添加形状到 LinearLayout Android

    我有一个线性布局 有一些自动完成和文本框 我想在线性布局中插入一个形状 矩形 我怎样才能做到这一点 我是安卓新手
  • 将 WCF 服务转换为 RESTful 应用程序?

    嘿 我在将 wcf 变成一项轻松的服务方面没有取得任何进展 所以我想知道当您在此处启动 WCF 服务应用程序时是否有人可以获取基本代码 using System using System Collections Generic using
  • 当我只知道字符偏移量时,如何创建范围对象?

    所以我有一个包含文本块的 div 之前用户已在该块中选择了一些文本 并且我从该选择中创建了一个范围对象 我存储了所选文本的起点和终点的偏移量 但在重新创建范围时遇到问题 以便我可以操纵它 quotables 是保存所有文本的 div 我不知
  • Spring Boot + Thymeleaf 找不到消息属性

    我正在尝试使用 Spring Boot 和 Thymeleaf 创建一个 Web 应用程序 但在让模板使用属性文件中定义的消息时遇到问题 它不是显示属性文件中定义的消息 而是显示 form welcome en GB 控制台没有记录任何错误
  • 如何知道 JavaScript 中的计时器是否被清除或超时?

    好吧 非常简单的问题 我正在参加 javascript 速成课程 如果我使用timer setTimeout 500 设置计时器 然后clearTimeout timer 要清除计时器 计时器的整数值不会改变 所以我的问题是如何知道计时器是
  • 初始化/重置结构为零/空

    struct x char a 10 char b 20 int i char c char d 10 我正在填充这个结构 然后使用这些值 在下一次迭代中 我想将所有字段重置为0 or null在我开始重用它之前 我怎样才能做到这一点 我可
  • Java:如何在 Swing 中进行双缓冲?

    EDIT TWO 为了防止尖锐的评论和一行回答没有抓住要点 IFF就像打电话一样简单设置双缓冲 真 那么我如何访问当前的离线缓冲区 以便我可以开始弄乱 BufferedImage 的底层像素数据缓冲区 我花时间写了一段正在运行的代码 看起来
  • 在不同情况下使用不同的 Hibernate 用户类型

    我使用 Hibernate JPA 作为我的 ORM 解决方案 我使用 HSQL 进行单元测试 使用 PostgreSQL 作为真正的数据库 我希望能够使用 Postgres 的原生UUID使用 Hibernate 键入 并在 HSQL 的
  • 在 pycharm/pydev 中调试 pytest 事后异常

    我想将 PyCharm 的内置 Pytest 运行器与调试器一起使用 而无需预先配置断点 问题是我的测试中的异常被 Pytest 捕获 因此 PyCharm 的事后调试器无法处理该异常 我知道使用断点是有效的 但我不想运行两次测试 在 Un
  • IOS5 setBrightness 不适用于 applicationWillResignActive

    I use UIScreen mainScreen setBrightness 在 sdk 5 0 中 更改我的应用程序中的系统背景光 以下步骤适用于我的应用程序 激活应用程序 将系统亮度设置为默认值 然后另存为sysBright 使用我的
  • 混合触发器与 WPF 触发器

    在我看来 Blend 风格和 Blend 风格之间有很大的区别 Trigger可以在 Interactivity 命名空间中找到 经典的Trigger可通过样式获得 ControlTemplates 等 在 WPF 中 我想这可能也适用于
  • 刷新缓冲区是什么意思?

    我正在学习C 我发现一些我无法理解的东西 可以显式刷新输出缓冲区以强制缓冲区 书面 默认情况下 读取cin脸红cout cout也被冲得通红 当程序正常结束时 因此 刷新缓冲区 例如输出缓冲区 是通过删除缓冲区中的所有内容来清除缓冲区 还是
  • 如何查看运行状态并停止耐用功能

    我想按需处理数百万条记录 处理时间大约需要 2 3 小时 我想要无服务器 这就是为什么尝试持久功能 第一次 我想检查一下 我可以运行持久函数多长时间 所以我创建了 3 个函数 用于启动 Orchestrator 功能的 Http 函数 Or
  • 在 Spark/Jetty-server 中重新加载静态文件

    我在这里描述了一个有点类似的问题 刷新 SparkJava 提供的静态文件 在我的应用程序中 用户可以将内容上传到一个文件夹 该文件夹也提供给用户 Spark staticFileLocation public 特征 据我所知 SparkJ
  • Github webhooks - 预推送挂钩

    我的要求是 每当开发人员推送到 github 时 在推送之前应该在 Jenkins 服务器上触发 CI 构建 如果构建失败 则应拒绝推送到 github 我需要为此编写挂钩 但我不想编写客户端挂钩 因为开发人员可以禁用它们 我想要服务器端
  • PHP - error_reporting 不起作用

    我的网络托管提供商不提供启用错误报告的选项 所以尝试使用 error reporting E ALL 但这也行不通 我尝试了以下脚本 如果我正确阅读了手册 那么这应该会生成错误通知 但这也行不通 我是否做错了什么 或者这是获得新的网络托管提
  • 在 Scala 中重载通用事件处理程序

    如果我定义以下通用事件处理程序 trait Handles E lt Event def handle event E 事件类型如下 trait Event class InventoryItemDeactivated val id UUI