5 h3 i! W. P" e6 h2 ?6 v; d5 N ! m3 E5 F# I' w! v使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。 8 K' ? e \% y( s; L4 ] }% r) e0 u _8 P0 K, B3 u( |( v7 a0 o( e9 Z , g. v' K8 u8 |# D) X [ Function Thar Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It ] 2 Y) S3 j$ g" x. u3 A* _ a8 N8 x
% Z9 B0 L' y Z+ E u, ~* \: e
Liskov替换法则 : s3 d2 Q7 N+ i- B0 N 8 I; a# C3 l& A' G g3 d# K1 a+ L- ~8 j1.显而易见,Liskov替换法则(LSP)是根据我所熟知的"多态"而得出的。 m4 Z: b3 X; |% J- y
7 F% u" P9 T d# A
9 B1 x( ~$ V, f2 h( Q( _- I2.例如: , y: S; S1 u, J7 V; s, h
+ w0 e) a8 R$ P8 n! e% S$ X
Z3 n* @- C/ `# g; K1 @方法drawShape应该可与Sharp超类的任何子类一起工作(或者,若Sharp为Java接口,则该方法可与任何实现了Sharp接口的类一起工作) ) Z, L6 M( U- y7 j2 Z ' Q, F2 e8 y7 D0 q. Y9 ` " Z- R8 b$ `2 h0 `- C V! B 但是当我们在实现子类时必须要谨慎对待,以确保我们不会无意中违背了LSP。 # ?3 X. t! K" O8 a* o' G& [
+ T" u! I5 |! r. g8 I2 s; p7 U9 x
3 E; V6 P" {1 s- c$ M
% o: |6 t( F6 ]. R
5 S: [2 G. Q3 t6 F8 e9 Y) f; t) F) c( l& X
3.若一个函数未能满足LSP,那么可能是因为它显式地引用了超类的一些或所有子类。$ O6 X( a6 A' a8 T) ?' K' u
% H: i. i" z w: e8 w+ m9 j6 d7 K
这样的函数也违背了OCP,因为当我们创建一个新的子类时,会不得不进行代码的修改。5 w# q- g( Q! H* X* q5 E
, |: D) g9 }4 ?* V2 Q5 u8 `