7 g6 Q$ a- m0 F8 ~/ i. E, G/ t5 M使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 x& V& l0 Y) \( ^, Q
4 V9 }0 O- W1 L$ c
) L% B' }! X& Q0 G$ L7 G
[ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] ) g' Q+ s5 T5 M! ~ ; k M; n V ]) S& G$ x) w ( w% E* P& u8 ?" p( aLiskov替换法则 & }( c6 t$ W* M) d: Z4 u K% N3 ^- D) O N6 O3 Q; @
* E% r; G i6 c2 H6 P1 V6 e: E
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 & z5 z. p3 ^* L
; ^: D3 [' p1 R
/ p5 w5 x6 [9 D9 @' f2.例如: " Y. a* x( `! R% h) e! g
- t1 P/ v# A& r& K/ F7 m( z& A* P/ P$ h) ]3 \- _
方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) ' f' ]- i6 U! d: r; V" B' u
$ q! K7 ~ Z& S j: _7 e/ n3 ~. g% C
+ r2 C. {! _7 Q! D$ Q3 t
但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 6 W; D y( G0 d; T% b$ M X
?7 y' d. g% T V; x ! {2 ^. k2 p& K8 b8 p4 m4 m " ~' f; d0 @6 J$ E; A) n
% r1 @2 o. w9 y: I * Z& {+ [( p) X# L7 o! b5 ? C/ M 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。3 e$ }7 d/ |. Y! Z8 H
- o) K6 w- k# r/ p# |
; A Q6 `2 C( \2 l6 r, C这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。 - _8 n: X% h& v . G0 [/ h- Q1 u% l! t 2 E* T3 A. ~" j>>更多一些面向对象得设计法则(4)