法则4:Liskov替换法则(LSP) 3 R4 k% p" }& X3 B# Z
) G6 o, m4 L2 e
3 F$ h/ b, v6 n5 v使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 1 d' `! ~6 U; R/ t! l4 _, X
" y/ n( R! ^& c ; C' i& q5 V* X [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] ! M e* _, F! D4 g$ f) x v' p H- O& D5 p: b
( w. \6 I' W, H+ ]! y. l
Liskov替换法则 / a( l% Y& Z( ^+ ?! v7 E# H7 j( ^
, i6 t0 s& P5 T4 w+ x! M
# _; D2 L9 k, \9 k+ G) U. f
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 $ @) H. ~ E* W5 H
0 K" k' i% v+ Q; H5 m2 _$ A
# r+ M T8 M) y, ?& Q- @5 I2.例如: & ?. j2 w/ X: C( \& i8 ~+ G 7 h' _/ q1 |/ J6 V/ b) R. K2 d2 H " g3 ] C& R0 P: W w1 _; o方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) ) j; O% ~+ U3 l6 N$ z% W
1 U, g, p" o' \ o! |! V3 K; w, i
+ d: p* L- I9 h% x' W6 W* { 但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 - {0 j' O" ^; h1 Q0 V {, j9 q 3 B0 [; c6 l) C' C6 s% ]* J 8 r# O2 ^/ H9 ~9 g# h : f" o; p- o/ \& X ]& K% x& o( t" {/ s$ {, i( `) F 6 u6 H+ d4 G7 a8 U) S% f 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。3 i2 j6 m4 z* d. o
# k: X: |, p" r' W8 O 5 A# J. l1 W- K/ ^/ N& }, I0 L* ^这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。3 I$ ^5 D+ Y* L. t& _
P5 ~0 N% ~ R, k# T3 K E ?, ~