当前位置: 首页 > 知识库问答 >
问题:

反射是否违反LSP?

施自明
2023-03-14

来自Liskov替代原理-www.blackwasp。co.uk

不符合LSP的一个常见指示是当客户端类检查其依赖项的类型时。这可以通过读取人为描述其类型的对象的属性或通过使用反射来获得类型。通常,根据依赖项的类型,将使用开关语句执行不同的操作。这种额外的复杂性也违反了打开/关闭原则(OCP),因为随着更多子类的引入,客户端类需要修改。

以下技术(使用反射)是否会导致违反LSP?

  1. 依赖注入

注:我来自C#背景。

从…起http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

反射大部分(也许全部?)依赖项注入容器在某种程度上依赖于反射——动态检查对象并确定它们的依赖项。

参考资料:

>

我怎样才能避免违反利斯科夫替换原则(LSP)?

Liskov替换原则是否也适用于实现接口的类?

这是否违反了Liskov替代原则,如果是,我该怎么办?

GWT的ActivityMapper是否违反了Liskov替代原则?

共有1个答案

庾远航
2023-03-14

在我理解LSP的方式中,它简单地说明了在任何情况下,子类都应该可以替换它们的基类,也就是说,只要您传递基类的实例(到方法、构造函数、服务等)您应该能够传递子类的一个实例,而无需任何代码修改即可使其工作。和其他原则一样,LSP是一个指导原则,而不是一个严格的规则,它使我们的代码更加开放,便于扩展。当框架编写者使用反射时,他们并没有破坏LSP,您可以简单地将其与使用服务位置的框架进行对比,服务位置现在被许多OO支持者认为是一种反模式,但他们必须这样做,以便他们的框架允许您选择自己的容器。和往常一样,这是一种权衡,取决于上下文(您自己的特定用例)。

 类似资料:
  • 问题内容: Liskov替换原理是SOLID的原理之一。我已经读过几次这个原理,并试图理解它。 这就是我的所作所为, 此原则与类层次结构之间的强行为契约有关。子类型应该能够被超类型替换而不会违反合同。 我也读过其他文章,对这个问题我有些失落。难道方法不违反LSP? 上面链接的文章摘录: 换句话说,当通过对象的基类接口使用对象时,用户仅知道基类的前提条件和后置条件。因此, 派生对象不能期望此类用户遵

  • 根据方法<code>java.util.concurrent的约定。未来#取消: 此方法返回后,对 isDone 的后续调用将始终返回 true。 Netty的Future接口扩展了它: 所以Netty应该遵守合同。但事实上Netty没有。您可以运行以下示例代码: 控制台应打印: 真 但实际上它打印: 假 以下方法也违反了合同: 我已经在github上创建了一个问题:问题 但是我仍然想在stack

  • 考虑以下程序: (编译器资源管理器) GCC和Clang的各种版本都可以接受它,但MSVC不能接受它,因为MSVC编译失败,出现错误消息 第一条错误消息向我暗示了ODR违规--但如果这个程序是格式不良的NDR,我需要帮助理解为什么会这样。我已经检查了标准草案中的temp.over.link,但我不相信我对它的解释是正确的。根据我的理解,程序是可以的,因为这些函数模板有不同的签名。 在不太可能的情况

  • 我问这个问题更多的是出于好奇,而不是真正关心它,但我一直想知道JavaScript事件系统是否违反了Liskov替换原则(LSP)。 通过调用,我们可以调度任意类型的,该事件可能由注册的处理。 如果我正确理解了LSP,那就意味着不应失败。但是,通常情况并非如此,因为事件侦听器通常会使用专门的子类型的属性。 在不支持泛型的类型化语言中,这种设计基本上需要将对象向下转换为中的预期子类型。 根据我的理解

  • 如果S是T的一个子类型,那么T类型的对象可以被S类型的对象替换。 子类有两种不同的行为(选中与未选中),在某些情况下,除非更改当前代码,否则无法用子类对象有效地替换基类用法,例如,如果编写如下代码: 这是违反吗?,为什么/为什么不?。 资料来源:http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-09234

  • 我是OOP的新手。最近我读到了关于Liskov替换原理的文章。 在下面给出的代码中,Square类继承Give_区域。假设Square类与Square相关(比如有效性检查)。Give_Area给出正方形的面积(4个顶点位于圆的周长上)和圆的面积。所以,如果给我一个半径,我必须打印圆和正方形的面积(由放置在圆周长上的顶点组成)。为了得到圆的面积,我使用了一个参数。但在求平方面积时没有参数。因此,我在