4 z6 n+ }) l3 F3 T8 a abstract class在Java语言中体现的是一种继承关系,父类和派生类之间必须存在“is a”关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 % s; P/ @+ U! c4 C % L1 c6 I2 |/ |' z& B) b 考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:* L9 B- s7 Q8 z* o* T
" P6 a! F J h J! o
使用abstract class方式定义Door:1 y, m; D) s$ A I: k/ H
& a4 ?: t7 d) E+ {5 y w+ ~ abstract class Door { % ]& w+ ]2 S1 c7 E2 m2 p( i, A- W! F5 f I
abstract void open();8 B! V4 s/ J& p* A! B7 N# O
$ A% R5 d9 s b1 Z) S0 }( z" x abstract void close();1 A5 o6 d8 ?: a( e+ m$ z8 Q
9 v, W' l/ R$ U) Y* o
} 3 M2 e& S3 w) v7 O- c 1 i7 D: o1 T E/ d 使用interface方式定义Door:9 ~5 B; d, N9 h2 j; E
" C i V& m! F. P9 k; S' Y
interface Door {; c' }* n# B+ ]
5 L! s ]0 c! N/ o( q* Q) V void open(); , w) l2 p( T4 Z # \% Y3 G( u# [3 H+ J9 @ void close(); 7 W4 ]; N& i& N$ R! E/ I9 l! j' C) R ], \; Z" M9 d2 J
} ( K2 k+ l& U3 f1 t, r8 W/ o& i2 ]$ l6 J
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。: P* K0 }! R+ T4 g
' b, J9 K; x5 g. o, Z0 w R
如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略),下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。) k6 U' b- W* q& x" @+ l
) L$ @" ?% M: F# g1 a5 K 解决方案一:( S0 p5 f3 H1 L7 y9 p5 X
j7 G4 D" G6 [7 ]. n4 W/ F4 N6 J
简单的在Door的定义中增加一个alarm方法,如下: . c) ^% S# d- @5 i1 ?6 p" W 8 M# M& g9 {0 o; {. ~& v$ @ abstract class Door {: @4 T3 T9 G5 l M! T
6 b3 [( V) [7 n" y3 g+ W* H
abstract void open(); + ^1 o4 K2 {3 {1 z! d! z% m' n# [( a' t1 e C$ Q
abstract void close(); ( i& r7 R. c; g ; y3 I9 A& C- V2 a9 F abstract void alarm(); 8 h* ~- Q1 f4 x# ^/ V$ y* W# H# E 2 T" J( E- F: D8 V. { l } " I9 `+ k, N/ {- b g5 D# r # x0 v5 F+ ], X 或者# ~6 ?6 ~ {* a/ n; d9 l2 X$ @
$ s h- s; m$ M1 ~ interface Door {3 P! s5 d$ U% J( u
$ l- e" N/ o. A2 |2 r! @ }" I6 G void open(); 9 f; E: }- k7 X/ T8 b ! G0 X8 ^% n2 c9 E1 p& O void close(); ) L( [1 V( M1 O6 @% ?, f1 u$ S# t; ^* m. O1 \ d3 X) H3 V" K
void alarm(); 8 u9 R: G9 w/ {6 D: ]1 z4 N8 E s. p$ n
} # E( T( K3 g1 b: Q0 I8 z- [4 r $ v+ |, N8 U4 u a( H4 [8 p: d 那么具有报警功能的AlarmDoor的定义方式如下:3 X& R( o1 T7 E+ l, e$ \
# _) q k; V& p8 v" j4 _; n class AlarmDoor extends Door {( c2 i$ V& E4 g _- p4 x, ~$ k
% l% [, T5 G& |3 ~) _) t R void open() { … } ; ?" k& e# O# ]/ m. `- ]8 d( z2 O6 u0 B- Z" [% B/ x# A @: o* J1 ]4 j5 g
void close() { … } * J- v: Y2 p# R! ?" \ 7 |) x3 b1 a: u& \+ S. s1 D void alarm() { … }# T' T( s( X. t
6 Z& G( @# |: F& a$ f
} : R3 A+ b7 v. d: `* A; P9 Y. {; k5 U% y) ]$ Q
或者! B; b* g) J; N0 c" d2 p* p
9 U( U( O E+ H7 p9 o
class AlarmDoor implements Door { ' p3 ~, M# ?' u * L( C* t/ K; P0 v9 c void open() { … }( ?5 D) G0 |" h) ` Y