【发布时间】:2020-05-22 07:51:41
【问题描述】:
有大量关于 LSP 的讨论,但所有讨论似乎都过于模糊。
AFAIK,LSP 声明要正确覆盖(而不是重载)子类中的超类方法,应确保子类方法:
- 不会产生父方法在任何情况下都不会引发的新型异常
- 与父方法具有相同的签名(在强类型语言的情况下)
- 与签名具有相同的语义意义
- 返回相同类型的值
- 返回相同语义的值
semantic meaning 我的意思是,如果基类方法暗示它返回 int 而这个 int 意味着,比如说,美元或欧元,那么重载的方法也应该暗示返回值是美元或欧元,并且即使在一种情况下返回 'RUB' 也会违反 LSP。
但是如果我的基类看起来像这样(示例是在 Python 中):
class A:
func(x: int) -> int
return x*2
class B(A):
func(x: int, y: string) -> int
return x*y
所以我的问题中有两个子问题:
- 术语
contract更实际的含义是什么?是interface的同义词吗? - 使用基类中不存在的签名(作为参数列表的一部分)进行重载是否违反 LSP?
【问题讨论】:
-
合约同接口。它只是更适合同一事物的另一个词。
-
您是在专门谈论 Python,还是这种语言不可知论?我看到您最初没有添加语言标签,但是当@SergeyBerezovskiy 添加了python标签时并没有恢复。
标签: python oop design-patterns liskov-substitution-principle