接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语言的限制(理论上)。接口可以从多个基接口继承,而类或结构可以实现多个接口。接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。
爱好者博墅t Ms)A.] ?,G.{
HT+UrG0爱好者博墅!^D[/j+W!Y'qs9z 接口好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。例子:
`L9C9bg-Hm!R0P8b S!G?E0f%igJ+X!}03g?`t4\Z0interface IMyExample {
爱好者博墅+AG,F
k#D9{ J%Eb*T
xd?]aC0 string this[int index] { get ; set ; }
爱好者博墅8f'lfwYNU6A
`*W!ZuS3o~8zQc0 event EventHandler Even ;
]`Q Iq&Wz&g3`0Bybd u;t)G5fY0 void Find(int value) ;
|+R4E\o0爱好者博墅ko_.OG1Q:z%Q+e string Point { get ; set ; }
"On(HLH
~~'y;^0爱好者博墅 NY[
e-H4Bm;z0A}
y:Ri,S8gX0爱好者博墅
Ok6[FX,F8Mpublic delegate void EventHandler(object sender, Event e) ;
爱好者博墅|f:O;D#X@+IO1b爱好者博墅F J({Z5nT0V2Z$q4[f:O.W"EAVr;n0爱好者博墅pt N.S,Lcasw#S/of 上面例子中的接口包含一个索引this、一个事件Even、一个方法Find和一个属性Point。
1{
~oR
B g\,bO)R0;Lt0R
dDE+X-{w I%b06G;J,D*M#_,H Y!H8G0-a6V&K9H+Di"y0 接口可以支持多重继承。就像在下例中,接口"IComboBox"同时从"ITextBox"和"IListBox"继承。
爱好者博墅U-FWHG
adJGA爱好者博墅;]&I F]*CxlLjQ/`爱好者博墅/Z^&TX4deBeZK ciNL;r*N/K]2a0interface IControl {
,M%TN
P6\#Zu#z#S0爱好者博墅sUU'K`yC]void Paint( ) ;
爱好者博墅7u@:T?9M1e y*Hh{%\爱好者博墅;AM$^;z_c2sf!F5i}
爱好者博墅
dk(q:Q$Y9D4PuK!puj4~1Sf0interface ITextBox: IControl {
爱好者博墅mX4AY,I9vNZO!w)Ds.`&P0void SetText(string text) ;
%xN]WM,B0)N5u9G\!QV3x]0~K9k0}
x.j%wTBP5`0爱好者博墅'V4IP.Ag:X;y#GA$Uinterface IListBox: IControl {
爱好者博墅&I? MDB8Po sy?os1o,t [0void SetItems(string[] items) ;
爱好者博墅 znl'vxL2]爱好者博墅']0q~
Q"^RCqF}
Z'}f5MDOv4i0k6^,b8V;~PCr0interface IComboBox: ITextBox, IListBox { }
爱好者博墅f1Z2N G1k7wG\!bz u7b b9?JRC+t?0&F4]4wtR?(^R9N~E0/P7a5ha2xX"q?0K0 类和结构可以多重实例化接口。就像在下例中,类"EditBox"继承了类"Control",同时从"IDataBound"和"IControl"继承。
爱好者博墅2q`
`0F _X&rTI爱好者博墅C#WT+| O+m%q@U-i+T p+p_N8[oR0$E:n'd3hFP0interface IDataBound {
!Rj^Y}3qJF0_+YQB(LMYR0 void Bind(Binder b) ;
爱好者博墅YAS/WZ3j6u"i+].|(^9d"U$grWNZ0}
爱好者博墅q6Y2R-rv爱好者博墅SKUax-J*l
y4kpublic class EditBox: Control, IControl, IDataBound {
tKj5H5c?
^%~0V)i%uC
X v0 public void Paint( ) ;
爱好者博墅[K0bx\B|;AUh.](ld)T4d0 public void Bind(Binder b) {...}
爱好者博墅1vp@
^.UYt9B$PLT;}d?7~@(_Z0}
f8U m"` | h&}0Pm}1CiE`Q)[y0爱好者博墅[h UL+M7s1@&t6_@eWk/G
Q0 在上面的代码中,"Paint"方法从"IControl"接口而来;"Bind"方法从"IDataBound"接口而来,都以"public"的身份在"EditBox"类中实现。
,_7?ZAP/Je0FS rZ)^GUnIb0爱好者博墅 uY"`\TK:{`8OS{ T'd!QM$_HY2L U0 说明:
1A*~7F`[.j5P0GG$U x
S)R`e~Y0爱好者博墅'}3jBb$c%_0C4h1FA{3_'Q
Ych5S(kB0 1、C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。
爱好者博墅w kJ*q9B6Y1_TQ$t
nZ8ps} y0爱好者博墅$f3~mHrr1G HRW爱好者博墅${r ztf~$T 2、接口和类都可以继承多个接口。
爱好者博墅AwXT9C(a爱好者博墅|r;Cy!E f4B&A-e\Zw|hYw0爱好者博墅slV,T,V 3、而类可以继承一个基类,接口根本不能继承类。这种模型避免了 C++的多继承问题,C++中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制。C#的简化接口模型有助于加快应用程序的开发。
^I8k(\q)j0爱好者博墅#CIM%eFwDaT/i;\,aA0爱好者博墅8t.UL5TW,r8P 4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。
爱好者博墅J0xTds;GC@ ` rH)TGkERob0爱好者博墅A/h2}f.|7?Q爱好者博墅p:T
`9b#[gdz 5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。
Fda/u:C `qA's0@ H#Yj4d`9B0爱好者博墅p)v9?xUF
o E(X@S*h0 接口与组件
`
U5{ [
~-~X\0爱好者博墅!FjE_9r爱好者博墅
{,T&x:DK+t爱好者博墅'te1HHEQ;y v6Hs[{ 接口描述了组件对外提供的服务。在组件和组件之间、组件和客户之间都通过接口进行交互。因此组件一旦发布,它只能通过预先定义的接口来提供合理的、一致的服务。这种接口定义之间的稳定性使客户应用开发者能够构造出坚固的应用。一个组件可以实现多个组件接口,而一个特定的组件接口也可以被多个组件来实现。
,~+|{)gamw i4up0爱好者博墅H9H0Wg/|q爱好者博墅-?2K
E!l"Oe,K9zY!fR"A"U
TX0 组件接口必须是能够自我描述的。这意味着组件接口应该不依赖于具体的实现,将实现和接口分离彻底消除了接口的使用者和接口的实现者之间的耦合关系,增强了信息的封装程度。同时这也要求组件接口必须使用一种与组件实现无关的语言。目前组件接口的描述标准是IDL语言。
8I
L1f9N I @0爱好者博墅\.a\Rq#~%V$u爱好者博墅"{r FO^2qGQ,?T爱好者博墅3g4}&qa4G
H 由于接口是组件之间的协议,因此组件的接口一旦被发布,组件生产者就应该尽可能地保持接口不变,任何对接口语法或语义上的改变,都有可能造成现有组件与客户之间的联系遭到破坏。
爱好者博墅3]B ?7iH_z^#G+i4Yl5y0J\7J)`|6b}v!^0爱好者博墅
`hH*e&m1u:Msk+er 每个组件都是自主的,有其独特的功能,只能通过接口与外界通信。当一个组件需要提供新的服务时,可以通过增加新的接口来实现。不会影响原接口已存在的客户。而新的客户可以重新选择新的接口来获得服务。
l
f#Vp-}0HNvZ9r9GML05C6A5E/v%x/[-_xh8{0%h
qI
FTZ0 组件化程序设计
爱好者博墅N5jC9W%\f爱好者博墅"gv0K-j r\d爱好者博墅5Em\W.uOr
M[4]@u;kR#{0 组件化程序设计方法继承并发展了面向对象的程序设计方法。它把对象技术应用于系统设计,对面向对象的程序设计的实现过程作了进一步的抽象。我们可以把组件化程序设计方法用作构造系统的体系结构层次的方法,并且可以使用面向对象的方法很方便地实现组件。
N nj#a\
R iH0sZ-d8V7_y
g0(yVARo3`0爱好者博墅Q*T
W8uX^&V*T9]2t 组件化程序设计强调真正的软件可重用性和高度的互操作性。它侧重于组件的产生和装配,这两方面一起构成了组件化程序设计的核心。组件的产生过程不仅仅是应用系统的需求,组件市场本身也推动了组件的发展,促进了软件厂商的交流与合作。组件的装配使得软件产品可以采用类似于搭积木的方法快速地建立起来,不仅可以缩短软件产品的开发周期,同时也提高了系统的稳定性和可靠性。
6WO8x(Q#x(V v0r2y;Hn8[\0!k?Ns![^lNH.I0;G2qux(aD-p0 组件程序设计的方法有以下几个方面的特点:
爱好者博墅-m&J#O*P7~2c7a.M{;Bv%F4Zz i&pe:b}-nx00@kmI/~5l4c06H_I*B$w,Ika0 1、编程语言和开发环境的独立性;
爱好者博墅
KYuZW1F:Q:u.f
^
n$Ic;i&V0D+v+C'LQ[9G%Y0爱好者博墅B-rdh5\]V 2、组件位置的透明性;
爱好者博墅&@.JoVW[V9J;W爱好者博墅%}}$J
?w爱好者博墅6|7i*bYe)\Xk`爱好者博墅[Si ]Ead9qB 3、组件的进程透明性;
fo?$d L[3\a&H.F0
q;CL`U,^4GNLXz0&g(l&mW"Q0\q]05s\LY4m!F'p%[#v0 4、可扩充性;
爱好者博墅F*N5v te4m#q%^6q&N9E\sg0爱好者博墅| b
a'r*O^A爱好者博墅(EL
HS0C^ 5、可重用性;
爱好者博墅.W/y]ct爱好者博墅+R&w
A
k(]U-u%z/U*O0?$h
q0爱好者博墅
e!]2R9rF/u+k,@6X 6、具有强有力的基础设施;
-ov];SB-`y09R,V`7wH6wS&In2V)Z0爱好者博墅pd(m%`q4N$~8@4P8CeN~+x:y0 7、系统一级的公共服务;
0_y'Q"H#wQx+k*u0爱好者博墅 b!cz(V8MChOpO(y.XQ.W0AVw$w6q^nN6h0 C#语言由于其许多优点,十分适用于组件编程。但这并不是说C#是一门组件编程语言,也不是说C#提供了组件编程的工具。我们已经多次指出,组件应该具有与编程语言无关的特性。请读者记住这一点:组件模型是一种规范,不管采用何种程序语言设计组件,都必须遵守这一规范。比如组装计算机的例子,只要各个厂商为我们提供的配件规格、接口符合统一的标准,这些配件组合起来就能协同工作,组件编程也是一样。我们只是说,利用C#语言进行组件编程将会给我们带来更大的方便。