标题: 一些面向对象得设计法则(4) [打印本页] 作者: post08070605 时间: 2009-9-10 22:40 标题: 一些面向对象得设计法则(4) 法则4:Liskov替换法则(LSP) 5 q* d X% a+ ? F' A `# e : {+ y0 ?2 S. V3 |4 B* [- P- v8 [9 B6 ?1 B2 k: k
使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 4 ~( ?, r4 W+ s% l; _+ m
# f# M$ A0 Y/ w
~+ T# c" @2 A4 [5 } [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 6 u: `2 e, ~% h1 \# f9 p# I . y* k9 E; w! U0 q5 m) b' G7 ]. Y: J8 T _, i
Liskov替换法则 . q3 t% c# n J8 M( y; v* E
2 N. J( Q) V8 L* U6 @6 O- A7 F T! J2 w7 C! H& S, O: {9 A
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 ; j. ^5 R/ Z/ p' r; A + E4 q& q" }8 X }) F0 r: N! A {
2.例如: ) e4 g/ `( H8 T: U / e6 J" G, |$ A) e$ t# ]0 p6 W4 O8 t& e! j" R- }( j S
方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) . g3 U* q2 U O5 _
5 E7 B( g% J" L% [2 q( e* O 0 h- ^5 D6 n+ n* f; X' J2 F 但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 ; |1 R# i0 J P* P' G# L4 J, ^3 g0 E
0 O: A0 l, O. X) t& \ K
: ^8 X7 z6 y( w . s$ ^8 N5 w9 P s0 ?* _ # R* Y5 Y z J& H+ [ 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。 K3 i- T7 I( N! M! K2 d , [9 }) p$ D2 f% I: i& a: M; M! r8 d8 \( c
这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。" G. g- D! h+ C* J( I; v' K u
/ `" J( d) U7 Z6 D) @2 q N
* p3 Y0 N L: J. P6 { >>更多一些面向对象得设计法则(4)作者: pxwgih 时间: 2011-12-31 10:36
楼主很棒!作者: fred_gavin 时间: 2012-4-10 22:52
谢谢分享!!!