0 Y F. X$ @' O/ m4 n! |2 e三、从设计理念层面看abstract class和interface3 D0 A+ q+ X9 `7 d% G
& w( J3 G5 o: v* w, s
abstract class在Java语言中体现的是一种继承关系,父类和派生类之间必须存在“is a”关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 % b, @2 ]6 l0 C8 Z( O1 P+ h. J5 V7 s
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:7 ^( g+ J) ^4 y1 y: \- ~3 g
( }/ V1 M0 ]' f$ e% @8 E! ~5 ^: N 使用abstract class方式定义Door:4 f' W5 c% R* d# A# y0 ^& a; k" P. r# Q3 x3 [
E( f# y& e( J abstract class Door { , L8 ~& `& l4 R% z/ i/ v+ ~' M# |$ p
abstract void open();& K$ C/ ^! p: r+ Q" L% T7 E' O6 C
) s6 [- B. C0 a: n% L abstract void close(); + d, N5 f$ r( y. P0 {. |& q# `% Z/ Z& _
}# x8 J# c3 O& R! x7 B' X( Q
5 N9 D/ s h! _5 W 使用interface方式定义Door: v! i! X$ C5 G
9 \" [/ ?8 G+ g b interface Door { 5 K$ u& t/ O0 C, S" Q: W" y8 d. S- o% Y
void open(); 7 a0 D0 |0 V# K/ B1 s$ f( P 6 q; Q( r7 H L! z) y void close();) ]. |* H5 E9 |- Q. }
' R0 F8 z+ |; y, A) k9 m- u) k
}8 z& ~1 _% }9 L$ i
. ~4 h% d0 o! a& L4 O; ~
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 9 v, J4 _# D. W$ Q1 t! V0 `- N0 z7 l
如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略),下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。 c$ l( `( M1 ` [5 K; Q" q% w! c
/ z- {. x- r2 g4 u. R: Q6 w) B
解决方案一: % r8 A% Q" d, E$ y& @- y o) e, L! `, V
简单的在Door的定义中增加一个alarm方法,如下: 3 v+ @& y6 H- e2 M& W3 \ X$ x* {; E# I' n! |1 M
abstract class Door { ! T B( A5 O! J! c! i) ~! i" P3 x3 W7 Z5 e2 Z. Y. h' a; ^( i
abstract void open();4 \ U9 q# Q, Q
- C9 c$ E9 K" Z: G/ `- |
abstract void close();) |7 U( N4 M3 V5 W! l
m# I8 w; _6 U abstract void alarm(); " F. W( z, T% x. y) f8 q3 E* w; ^$ n& Q3 W# Q- `4 `
} 5 `* M. C0 F7 r0 h9 d: C! A4 ^ # _ g1 f' G- W' V, b' ] 或者! G5 M1 H" \: C/ n w
, A* |1 a: A! x$ g
interface Door { 8 A0 x, k# c! Q2 i7 n9 Q. Z) G8 o/ ~) q/ V& W C* Y5 Y
void open();8 b; G& X/ v' i7 X
( b7 q, q l5 Z& p
void close();* }8 C/ B! x5 g2 S6 _
7 p1 O6 @/ R( [: u# h
void alarm(); 3 ^/ @& z8 C# E v a: P2 U# E! ]. ] ?( o7 w
}* w% {$ T+ Z& D* |& {+ Z
l: J7 T+ d. ~4 o9 d. s5 u 那么具有报警功能的AlarmDoor的定义方式如下: ! W+ I2 }9 v5 ~5 x6 N5 }7 T! S( R, z" |7 N c
class AlarmDoor extends Door {6 K: U7 D, D3 E% G4 O' `" g
( ^* v; X) q c void open() { … } 9 \. Q0 F/ r4 O5 b7 Z5 O3 @+ Q ! s/ o* E$ k% Z6 Q void close() { … }$ `! U2 l) ]& Z( F. z6 E- O8 u9 X1 N
3 f: h# j) h9 x' I$ R2 ?, f
void alarm() { … } , C j: u3 w0 c6 S7 X8 C) C2 l7 H. }9 ^- M. ~! U2 U1 G+ n
}$ n5 s2 @5 q: A$ X, {: \5 }
) Z9 r+ r- D0 I+ z. M2 n* ^
或者 $ }- H. ~% Q4 b# \' e9 j5 n% W. K- q. w0 k& ?5 [! k
class AlarmDoor implements Door { " R8 ~4 A+ Z) [9 } $ D# P5 I1 O2 E8 I- D void open() { … } $ g$ r+ I3 M! o2 O% ^; U- R, d: n! y
void close() { … }* R! }3 n5 {9 i7 W0 N# Z