法则4:Liskov替换法则(LSP) $ j. m G O* m# {' V
# `0 d; G: `/ X* ]. W* @$ x
! h- i; F% a h( G+ h' x; ?0 b( U使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 + ^/ `7 o2 |5 C
1 z4 P; |8 Z" {4 z* q2 c; }/ @) I4 }+ [; I
[ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 7 v1 i) M: ~' d1 U# R" r5 E
4 |( @$ y9 T# c; ]% e, O# o % \3 U6 [8 _ C+ \) G; _ tLiskov替换法则 8 A" x/ M9 \' ^" O1 O' T, N S& V' m2 M$ }0 n/ N) P [2 o3 Z) U1 j& b
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 4 t8 G7 q; h0 ~- U1 i/ E
! z! a+ d$ ^0 z* v% e6 y
( V9 X4 G$ E6 N5 q" `# e2.例如: * C5 E" ?4 ]& L- f' J+ B, t/ n) H# g9 a4 {- Z
9 D; `* |& V- u0 O. `; N7 ~
方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) ( t& u8 a5 w+ V2 v: \ ; q8 N* f d5 ^; ?, M' d% r$ u, B' i
但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 / O2 r- j* ~% Y' w! g7 c( f
# O' h9 v5 G! R/ H1 G
. `5 y# S& J1 @( E e' n( O7 Q 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。 $ r v" t" j0 V / W/ H. v2 z4 U8 S% X+ u& E1 y7 G: \5 s! `9 z. n! z A% N# J5 h
这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。' f$ s% L+ }+ O: O' {
" a: `4 e5 B. g, d5 \7 N
- O, k$ X [% W >>更多一些面向对象得设计法则(4)