法则4:Liskov替换法则(LSP) - x7 J) H+ f. [& F6 Y! |) c! `2 Q' q& j& [- l
1 V' t. Y( g% e0 W" W8 s
使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 * K- r4 R7 y8 g W% B2 c( o" Y6 ?$ ?8 D8 U' f9 J
" P4 f3 d) N1 v
[ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 5 f) A% Z) B1 X : N: r# y8 H% ^& ] 9 |; m' a" B/ T( b' sLiskov替换法则 / A+ Y7 b8 s$ [, \# ]
' M2 z! P/ N9 l0 _2 o6 s% o* U; y
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 * Q( Q# I1 q" q2 D+ y( l% k$ f; Y: p1 r' }" P9 o
5 D5 X4 k$ a! D# Q
2.例如: . x1 B; P+ T5 p. \2 P7 H( p
; k L2 h5 d5 `, v
1 m! Q: s, ?7 H% o" `
方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) : Q6 N9 P5 ^: g Z# Q. W& y
5 U) \* W8 N/ K5 h/ |' z ; J; H. @5 F3 Q1 a f5 \9 N4 R. @$ H7 I 但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 ( Q/ Y8 S# l) i; ]; S6 \# p L) g
; Z. i' j- }3 c, h& ~ ; h! Z! R0 n% `! N9 ^ |
$ K! E {# \8 t5 r1 ?" p" k4 o
% O8 _/ r; ]$ {% J* \ 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。 / U1 V0 E, A7 a( p* E2 `1 C9 H; k; y) N, {9 _' f: K' d
" D) W8 l' v3 k+ [1 l
这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。. ^7 Z* D" r7 p# F4 M* t. L
' b, w. m# o1 \% T