- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我更多是出于好奇而不是真正关心它 ,但我一直想知道 JavaScript 事件系统是否违反了 Liskov substitution principle (LSP)或不。
调用 EventTarget.dispatchEvent
,我们可以发送 Event
可能由已注册的 EventListener
处理的任意类型.
interface EventListener {
void handleEvent(in Event evt);
}
anyEventListener.handleEvent(anyEvent)
不应该失败。但是,通常情况并非如此,因为事件监听器通常会使用专用
Event
的属性。子类型。
Event
EventListener
中预期的子类型的对象.
type
的简单事实?通过
EventTarget.addEventListener
注册监听器时防止 LSP 违规?
Event
子类没有违反 LSP,我实际上担心
EventListener
实现者会通过加强
EventListener
的先决条件来违反 LSP。的界面。
void handleEvent(in Event evt)
中没有任何内容契约(Contract)告诉你,传递错误的东西可能会破坏
Event
子类型。
EventListener<T extends Event>
以便实现者可以使契约(Contract)明确,例如
SomeHandler implements EventListener<SomeEvent>
.
EventTarget
调用。注册地址和
与特定类型相关 .
interface EventListener {
bool handleEvent(in Event evt); //returns wheter or not the event could be handled
}
最佳答案
LSP 的含义很简单:子类型不能以违反其父类(super class)型行为的方式行事。这种“父类(super class)型”行为基于设计定义,但总的来说,它只是意味着可以继续使用该对象,就好像它是项目中任何地方的父类(super class)型一样。
因此,就您而言,它应遵守以下规定:
(1) 一个KeyboardEvent
可以在代码的任何位置使用 Event
是期待;
(2) 对于任何函数Event.func()
在 Event
,对应的KeyboardEvent.func()
接受 Event.func()
的类型的参数或其父类(super class)型,返回 Event.Func()
的类型或其子类型,并且只抛出 Event.func()
throws 或其子类型;
(3) Event
KeyboardEvent
的一部分(数据成员)调用 KeyboardEvent.func()
不会改变以 Event.func()
不可能发生的方式(历史规则)。
什么是不是 LSP 要求的,是关于 KeyboardEvent
的任何限制吗? func()
的实现,只要它确实如此,从概念上讲,Event.func()
应该。因此,它可以使用 Event
未使用的函数和对象。 ,在您的情况下,包括那些不被 Event
识别的自己的对象父类(super class)型。
至已编辑的问题:
替代原则要求一个子类型(在概念上)将与其父类(super class)型在预期父类(super class)型的任何地方的行为方式相同。
因此,您的问题归结为“如果函数签名需要 Event
,这不是它所期望的吗?”
答案可能会让您感到惊讶,但它是 - “不,它没有”。
原因是函数的隐式接口(interface)(或隐式合约,如果您愿意)。正如您正确指出的那样,有些语言具有非常强大和复杂的类型规则,可以更好地定义显式接口(interface),从而缩小允许使用的实际类型。然而,单独的形式参数类型并不总是完整的预期契约。
在没有强(或任何)类型的语言中,函数的签名没有或很少说明预期的参数类型。然而,他们仍然希望这些论点仅限于一些隐含的契约。例如,这是 python 函数所做的,C++ 模板函数所做的,以及得到 void*
的函数。在 C 中做。他们没有表达这些要求的句法机制这一事实并没有改变他们期望参数遵守已知契约(Contract)的事实。
即使像 Java 或 C# 这样的强类型语言也不能总是使用其声明的类型来定义参数的所有要求。因此,例如,您可以调用 multiply(a, b)
和 divide(a, b)
使用相同的类型——整数、 double 数等等;然而,devide()
期待不同的契约(Contract):b
不能为0!
当您查看 Event
现在的机制,你可以理解不是每个Listener
旨在处理任何 Event
.一般使用Event
和 Listener
争论是由于语言限制(所以在 Java 中你可以更好地定义正式契约(Contract),在 Python 中 - 根本没有,而在 JS 中 - 介于两者之间)。你应该问自己的是:
代码中是否存在 Event
类型的对象? (不是 Event
的某些其他特定子类型,而是 Event
本身)可能会被使用,但是 KeyboardEvent
也许不会?另一方面 - 代码中是否存在 Listener
可能会使用对象(而不是它的某些特定子类型),但可能不会使用特定的监听器?如果两者的答案都是否定的——我们很好。
关于javascript - JavaScript 事件系统是否违反了 LSP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43244192/
出现以下错误: INSERT INTO GroupMembers VALUES ('Goldfrat', 'Simon Palm') * ERROR at line 1: ORA-02291: int
据称以下代码违反了 OO 指导原则。 public class Main { public static String NAME = "James"; public Main() {
我创建了一个名为 EvenementBean 的 EJB 2 进行测试。然后我就把它删除了。现在每当尝试部署我的 .ear 项目时,我都会收到以下错误: WARN [verifier] EJB
我正在开发的一个应用程序正在使用 Oracle 和 Hibernate 作为 ORM。当我尝试插入 PartyUserObject 时,我不断收到以下错误: could not insert: [Pe
我已经实现了一些代码行: if(condition){ Class a = new Class(); method(a.b(), a.c()); }else{ method(null, n
这个问题在这里已经有了答案: Static analysis of noexcept "violations" in C++ (2 个答案) 关闭 4 年前。 我大量使用 noexcept,不幸的是
我有一个 MVVM 应用程序,在我的几个 VM 中,我使用 CollectionViewSource.GetDefaultView(datasource) 来初始化我的 ICollectionView
当我尝试运行我的网站时,它显示 500 internal server error : Internal Server Error The server encountered an internal
运行生存分析,假设变量的 p 值具有统计显着性 - 假设与结果呈正相关。但是,根据 Schoenfeld 残差,违反了比例风险 (PH) 假设。 在纠正 PH 违规后,以下哪种情况可能发生? p 值可
我知道以下是一个主观问题,但您的指导方针确实有助于我追求干净、可测试的代码。 请考虑以下示例,我认为它违反了一系列设计原则。 public class OfferEligibilityCheckerS
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
当我尝试将 Paho MQTT javacrript 与 Mosquito MQTT websockets 一起使用时,只要我用来服务页面的 Web 服务器和 Mosquito 位于同一服务器(同一来
我在通过 hibernate 映射 oracle 时遇到问题 我有这些类(class) Stock.java package com.mc.stock; import java.uti
在我的项目中,我试图解决 Sonar 违规问题,我坚持使用这个,我有以下代码 不允许使用以下属性:语言 谁能告诉我如何解决这个 Sonar 违规问题?我可以简单地删除这种“语言”吗属性还是我应该输
我正在尝试记录唯一标识符,所以我无法承受重复记录我的 ID 当我尝试更新名为 Clients 的 SQL Server 表时,我收到类似这样的错误。 Violation of PRIMARY KEY
我正在尝试实现一个解决方案,以在给定的整数列表中找到第 k 个最大的元素,其中重复项具有 O(N*log(N)) Big-O 表示法的平均时间复杂度,其中 N 是列表中元素的数量。 根据我的理解,合并
如果 tuple_size 模板是一个完整的类型,结构化绑定(bind)特性表示它会像分解一样与元组一起使用。当 std::tuple_size 在程序的某一点是给定类型的完整类型而在另一点不完整时会
我们的应用目前已从 google play 中删除,因为它具有 SMS 权限。我们已经删除了权限并上传了一个新的 apk,但项目的状态仍然是删除。我们是否必须等待他们审核,或者是否需要任何其他必要的步
*i 和 u.i 如何在此代码中打印不同的数字,即使 i 被定义为 int *i = &u.i;?我只能假设我在这里触发了 UB,但我看不出具体情况。 ( 如果我选择“C”作为语言,ideone de
您好,我正在 Oracle SQL dev 中开发一个数据库,它试图从另一个表访问外键。我目前正在处理使用以下 CREATE 语句创建的 ItemOrdered 表 CREATE TABLE Item
我是一名优秀的程序员,十分优秀!