Liskov Substitution Principle - www.blackwasp.co.uk

不遵守LSP的一个常见指示是客户端类何时检查其依赖项的类型。这可以通过读取人为地描述其类型的对象的属性或通过使用反射来获取类型来实现。通常,将根据依赖关系的类型使用switch语句执行不同的操作。这种额外的复杂性还违反了开放式/封闭式原则(OCP),因为在引入更多子类时将需要修改客户端类。

下列使用反射的技术是否会违反LSP?

  • 依赖注入
  • 控制反转

  • 注意:我来自C#背景。

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

    反射;大多数(也许全部?)依赖注入容器在某种程度上依赖于Reflection –动态检查对象并确定其依赖关系。

    参考资料:
  • Hierarchy violates Liskov - so what?
  • How can I avoid breaking Liskov Substitution Principle (LSP)?
  • Does Liskov Substitution Principle also apply to classes implementing an interface?
  • Does this violate the Liskov substitution principle, and if so, what do I do about it?
  • Does GWT's ActivityMapper violate the Liskov Substitution Principle?
  • 最佳答案

    以我对LSP的理解,它只是声明子类在每种情况下都可以替代其基类,也就是说,每当您将基类的实例传递给方法,构造函数,服务等时,您都应该能够传递子类的实例,而无需任何代码修改即可工作。像任何其他原理一样,LSP是一个准则,而不是严格的规则,它使我们的代码更易于扩展。当框架编写者使用反射他们没有破坏LSP时,您可以简单地将它与使用Service Location的框架进行对比,该框架现在被许多OO支持者视为反模式,但是他们必须这样做,因此框架允许您选择自己的容器。与往常一样,这是一个折衷方案,它取决于上下文(您的自己的特定用例)。

    09-13 03:52