法则4:Liskov替换法则(LSP) 3 Q9 g, G0 I ?$ {( r$ t & g6 C' i/ v0 J; C) d6 Y G7 m3 _, V1 z! j+ c3 a8 R
使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 3 k% X! r: b4 s$ \: D* o
" }' k' i; c9 P. @% o
- ]% q, F4 I6 O [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] % h! I5 ~1 F: ]: O4 `& c O( @5 N0 K8 w' j& I5 @
+ V) C2 J! @ ^6 n- Q. E* j, H# E1 d" T
Liskov替换法则 ! u1 j- t4 [% [' i
$ b& c1 W( Y9 R. O! { ^7 ~/ f: m
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 - Y8 v5 { J+ q" o6 a: ^" M % L. z) L( N0 ]4 Q . T4 q/ n' d, |2.例如: . E, s7 G7 K3 @2 F5 s- a* d6 F6 i
1 C+ R! x3 B2 i( }9 s3 X; A
5 ~0 {( M; `+ g' G1 w L! _- D' ?方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) 8 E! ~6 y2 I4 Q; c( b
( i) j1 a s# ^( E5 L % x! L: C8 m# i+ G; a/ U 但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 - |/ H& P D* G: H; x& B 7 t- M5 N2 Y7 Q/ }3 B# ]7 I + h+ q" g+ f0 L) P; C$ E0 | 9 h1 x$ a: P3 Z$ r
) `) u Q# }/ ^: w" W/ m5 l
S; ~( _/ J8 N0 u! j1 b 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。$ @ z, b& y* O% n' ~, f! E
( h5 F6 Y; b5 N " F, r6 t0 Y8 C Y- q, ~这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。 5 p5 J2 k4 @$ c. G7 a" j: }& P' ^4 |; |4 i" Y' @
& x4 s( k1 d* c3 |* b; I* T0 V >>更多一些面向对象得设计法则(4)