【发布时间】:2011-01-16 07:11:08
【问题描述】:
简单地说,Liskov 替换原则指出派生类可以替换基类而不影响用户。 如果基类是抽象类,即没有用户使用基类的实例,那么 Liskov 继承限制是否仍然适用于派生类?
【问题讨论】:
标签: oop design-principles liskov-substitution-principle
简单地说,Liskov 替换原则指出派生类可以替换基类而不影响用户。 如果基类是抽象类,即没有用户使用基类的实例,那么 Liskov 继承限制是否仍然适用于派生类?
【问题讨论】:
标签: oop design-principles liskov-substitution-principle
不能实例化特定类并不意味着不能使用它。在这种情况下,调用代码使用抽象基类作为其操作所依据的合约的定义。从这个意义上说,从基类派生的每个类都应该相对于基类定义的接口是可互换的,所以是的,Liskov 仍然适用。事实上,这是您希望为具有某些共同行为的类集合创建一个抽象基类的主要原因之一——因此您可以根据基类接口定义操作,而不用关心哪个派生类你实际上是在操作。
【讨论】:
是的,因为调用者总是可以这样做:
BaseAbstractClass instance = new DerivedClass();
【讨论】:
抽象类与 LSP 完全不冲突。许多人认为直接从客户端代码中使用“new”是违反 LSP 精神的。如果您同时实例化并使用一个对象,那么您将紧密地绑定到该实现,并且您根本无法“替换”它。
考虑在由某种存储库创建后通过工厂创建对象或作为参数传入或通过依赖注入,这些存储库可以专注于决定在各种情况下需要哪些具体类型。
【讨论】:
简而言之,是的。 LSP 基本上适用于所有公共继承。基类是抽象的这一事实并没有改变这一点。基类定义了一个接口,所有合法的派生类都必须满足该接口的所有要求。
【讨论】:
是的。
请参阅Uncle Bob's The Liskov Substitution Principle article 的“真实示例”部分(第 7-8 页)。
【讨论】: