来自Liskov Substitution Principle - www.blackwasp.co.uk
不遵从LSP的一个常见迹象是客户端类检查其依赖关系的类型。这可以通过读取人工描述其类型的对象的属性或通过使用反射来获得类型。通常,switch语句将用于根据依赖项的类型执行不同的操作。这种额外的复杂性也违反了开放/封闭原则(OCP),因为在引入更多子类时需要修改客户端类。
以下techonolgies(使用反射)是否会导致违反LSP?
注意:我来自C#background。
来自http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx
反射;大多数(也许全部?)依赖注入容器在某种程度上依赖于Reflection - 动态检查对象并确定它们的依赖关系。
参考文献:
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?
答案 0 :(得分:2)
我理解LSP的方式,它只是声明子类在每种情况下都应该可替代它们的基类,即每当你传递基类的实例(到方法,构造函数,服务等)时。 。)你应该能够传递一个子类的实例而不需要任何代码修改就可以了。与任何其他原则一样,LSP是一个指导而非严格的规则,它使我们的代码更具开放性以实现可扩展性。当框架编写者使用反射时他们没有破坏LSP,你可以简单地将它与使用Service Location的框架进行对比,现在这被许多OO支持者视为反模式,但他们必须这样做,所以他们的框架让你选择自己的框架容器。与往常一样,这是一个权衡,它取决于上下文 (您的自己的特定用例)。