标题: 一些面向对象得设计法则(4) [打印本页] 作者: post08070605 时间: 2009-9-10 22:40 标题: 一些面向对象得设计法则(4) 法则4:Liskov替换法则(LSP) 5 b# r! z" a5 ^+ m$ a: X , L6 L- @; m5 ^! ^0 t7 b% V6 k- V0 L# A* \
使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 5 ~ N7 {& N6 n+ W! \. i. S! x9 U. k, r9 Z
7 Y- f0 k# Z2 j- _# a8 c
[ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 2 o7 t& a% F. ~. R* s# a9 ]# q, _* U
/ _! S5 m6 ]9 }; v/ j + b% I4 w& u6 V8 o- fLiskov替换法则 . w7 @ N: N/ S! s2 F. G
, f# R+ S4 [* z/ u
% w {- j5 d/ B( a3 ^) `! n. Y
1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 ) N+ P+ k# a$ c6 I, s. W" y! Z& j9 }# n: y0 D! D
! _6 X2 f1 f. o
2.例如: 8 Z# t9 v$ o7 a% j9 \! f4 H5 S/ D. \6 z1 Z! U) \9 V
2 c' l x, f E( M5 h0 K) j方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) " A& D9 b) o4 ^8 h7 L# ~0 ~7 O4 v: y- j! G) d. M- R" r
, G2 H- L5 i: b5 J
但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 5 |8 J: m6 N, R: p0 O4 h# ]: J8 i1 [' V, Z7 }- }4 Z
, n( \3 O, \* \: ~8 w, E
. ]/ Y1 g- \% [4 {9 i
1 v2 {, k* S3 q1 g. V. k * m% {4 N! N* l2 ?! ^/ N) U5 D 3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。 ) n. J& W8 l$ m" L* T4 v* ?: u+ `8 H
+ ~0 _, {, n" R% b- a% l" q
这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。% w7 l- f$ x6 ~( y# }