标题: 一些面向对象得设计法则(4) [打印本页] 作者: post08070605 时间: 2009-9-10 22:40 标题: 一些面向对象得设计法则(4) 法则4:Liskov替换法则(LSP) & G) I: `7 O' v5 ` T. B3 X Q
% M& N" c8 q! H3 S
4 e/ `$ H/ M: r7 Z0 t5 i1 r' Y使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 - h. {# w$ h' \1 F7 ?* P $ V8 b8 @7 W* l( n5 n0 c7 W/ k4 s2 `! Z# Q4 l4 D* x
[ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 2 g% o3 o5 g [! q) [3 j2 _$ t( D8 Y6 ~- x$ E
2 v# v( h5 K9 y( TLiskov替换法则 3 t9 \5 `8 E' |( t/ W6 Y2 a
7 y2 g V$ x3 m
" H- \% S; X# b" k; N
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 . t: b( v* D! \5 S* W. f
% \1 O# o5 K4 t& X& z' S
+ h9 f7 _/ F5 G k. c6 R; a
2.例如: ' z. K* l% l2 T( e- P j- m9 t
- f) p6 i7 f: w5 S 0 L6 d- f/ C4 t: H1 A! A, l方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) . j2 `# t/ V2 R6 m' S1 H0 |% V
7 b* {- I" a @" C3 @7 F+ A9 @2 u6 L) I3 L) D# W9 y( n L
但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 # j% n! e9 n' u% u) Z
4 D' O6 u- E$ w6 {
+ L$ D: A" L1 [) z* ` 3 Q3 x8 O7 h$ q& a, l 7 e& P! G' o8 _/ d D( w4 b& H( L, Z
3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。 3 z6 O+ A- `/ s4 ^. i- L 1 n# R" b. Z3 C" w . f: a; V/ u s# c$ h3 g这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。 ( J% i* F& ?/ H6 Q* B1 x5 Z6 j G' @: e! b; i9 T
& Y/ ?# C0 x* c# T" l: x >>更多一些面向对象得设计法则(4)作者: pxwgih 时间: 2011-12-31 10:36
楼主很棒!作者: fred_gavin 时间: 2012-4-10 22:52
谢谢分享!!!