松散地说,Liskov Substitution Principle声明派生类可以替代基类而不影响用户。 在基类是抽象类的情况下,这意味着没有用户使用基类的实例,Liskov继承限制是否仍然适用于派生类?
答案 0 :(得分:6)
仅仅因为你不能实例化一个特定的类并不意味着你不能使用它。在这种情况下,调用代码使用抽象基类作为其运行的合同的定义。从这个意义上讲,从基类派生的每个类都应该可以与基类定义的接口互换,所以Liskov仍然适用。实际上,这是为什么要为具有某些常见行为的类集合创建抽象基类的一个主要原因 - 因此您可以根据基类接口定义操作,而不关心哪个派生类你实际上正在经营。
答案 1 :(得分:1)
是的,因为来电者可以随时执行此操作:
BaseAbstractClass instance = new DerivedClass();
答案 2 :(得分:0)
抽象类根本不与LSP冲突。许多人认为直接从客户端代码中使用“new”是违反LSP精神的。如果你实例化并使用一个对象,你就会紧紧地绑定到那个实现,而你根本不能“替换”它。
考虑让对象通过工厂创建或作为参数传递或通过依赖注入传递后,由某种存储库创建,可以专注于决定在各种情况下需要哪些具体类型。
答案 3 :(得分:0)
简而言之,是的。 LSP主要适用于所有公共继承。基类是抽象的这一事实并没有改变这一点。基类定义了一个接口,所有合法的衍生产品必须满足该接口的所有要求。
答案 4 :(得分:0)
是
请参阅Uncle Bob's The Liskov Substitution Principle article的“真实示例”部分(第7-8页)。