13

松散地说,里氏替换原则指出派生类可以替代基类而不影响用户。如果基类是抽象类,即没有用户使用基类的实例,那么 Liskov 继承限制是否仍然适用于派生类?

4

5 回答 5

7

仅仅因为你不能实例化一个特定的类并不意味着你不能使用它。在这种情况下,调用代码使用抽象基类作为其操作所依据的合约的定义。从这个意义上说,从基类派生的每个类都应该相对于基类定义的接口是可互换的,所以是的,Liskov 仍然适用。事实上,这是您希望为具有某些共同行为的类集合创建一个抽象基类的主要原因之一——因此您可以根据基类接口定义操作,而不用关心哪个派生类你实际上是在操作。

于 2010-02-12T19:15:44.643 回答
1

是的,因为调用者总是可以这样做:

BaseAbstractClass instance = new DerivedClass();
于 2010-02-12T19:15:32.410 回答
0

抽象类与 LSP 完全不冲突。许多人认为直接从客户端代码中使用“new”是违反 LSP 精神的。如果您同时实例化并使用一个对象,那么您将紧密地绑定到该实现,并且您根本无法“替换”它。

考虑通过工厂创建对象或作为参数传入或通过依赖注入在由某种存储库创建之后,该存储库可以专注于决定在各种情况下需要哪些具体类型。

于 2010-02-12T19:19:03.793 回答
0

简而言之,是的。LSP 基本上适用于所有公共继承。基类是抽象的这一事实并没有改变这一点。基类定义了一个接口,所有合法的派生类都必须满足该接口的所有要求。

于 2010-02-12T19:20:04.417 回答
0

是的。

请参阅鲍勃叔叔的 Liskov 替换原则文章的“真实示例”部分(第 7-8 页)。

于 2010-02-12T19:20:08.020 回答