第13章接口_第1页
第13章接口_第2页
第13章接口_第3页
第13章接口_第4页
第13章接口_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第13章章 接口接口 n13.1 面向组件编程思想面向组件编程思想 n13.2 定义定义 n13.3 实现实现 n13.4 使用使用 总结总结 13.1 面向组件编程思想面向组件编程思想 软件体系软件体系,开发开发,和产品本身越来越复杂和产品本身越来越复杂,更新版本的混乱导致更新版本的混乱导致”软件危机软件危机” 的产生的产生,所以必须从所以必须从”底层底层”起就要实现面向对象的应用模式起就要实现面向对象的应用模式. 只是从只是从”底层底层”解决面向对象应用并不是马上可以实现的解决面向对象应用并不是马上可以实现的. 5060年代专家提出了组件的概念年代专家提出了组件的概念. 80年代后年代后

2、,面向组件设计模式开始大量应用面向组件设计模式开始大量应用,以试图解决上述问题以试图解决上述问题. 组组 什么是组件什么是组件? 组件是一个功能相对完整的积本组件是一个功能相对完整的积本.组件与组件透过大家共同制定的组件与组件透过大家共同制定的一一 组方法组方法进行操作进行操作. 使用的人不必使用的人不必(理想情况理想情况)关心组件内具体情况关心组件内具体情况,只要理解组件的只要理解组件的I/O就就 可以正确应用组件可以正确应用组件.并且将组件有机的组合起来并且将组件有机的组合起来,形成一个完整的产品形成一个完整的产品. 组件可以单独开发组件可以单独开发,单独编译单独编译,单独测试单独测试.通

3、过组件的复用通过组件的复用,可以大大提可以大大提 高开发的各种指标高开发的各种指标(可行性可行性,效率效率,成本成本,质量质量,可维护性可维护性) 13.1 面向组件编程思想面向组件编程思想 现实生活中的组件概念现实生活中的组件概念: 想象一下组装一台电脑想象一下组装一台电脑: CPU 主板主板,电源电源,机箱机箱,显卡显卡,内存条内存条,硬盘硬盘, 有了组件的概念有了组件的概念,和一些必要的知识和一些必要的知识,人们很容易把各种组件安装在一起人们很容易把各种组件安装在一起,形成形成 一个完整的产品一个完整的产品,产品升级也变得较容易产品升级也变得较容易 什么是接口什么是接口? 想象一下想象一

4、下:1.实现同一功能的组件是都应该有一个相同的外部边界实现同一功能的组件是都应该有一个相同的外部边界? 以便使使用者可以随意选择不同以便使使用者可以随意选择不同”性能性能”但功能相同的组件但功能相同的组件. 各种各种USB的设备的设备,是否都有一个规格相同是否都有一个规格相同,数据线定义相同的插口数据线定义相同的插口? 2.各种组件组合在一起各种组件组合在一起,组件间是否也需要相同的边界组件间是否也需要相同的边界?以便使组以便使组 件能连接起来件能连接起来,并正确工作并正确工作. 硬盘与主板的连接硬盘与主板的连接,是否需要一根是否需要一根”数据线数据线”和跟数据线相容的插座和跟数据线相容的插座

5、? 同理同理,在软件组件中在软件组件中,也需要这样的边界也需要这样的边界,-接口接口 接口接口-一组方法的一组方法的定义定义的集合的集合,组件与组件通过相同的接口联系组件与组件通过相同的接口联系. 13.1 面向组件编程思想面向组件编程思想 为什么要使用接口为什么要使用接口? 1.接口是组件联系的窗口接口是组件联系的窗口,组件一旦发布组件一旦发布,就可以在接口的就可以在接口的”稳定性稳定性”下使开下使开 发者构建出稳固的应用发者构建出稳固的应用. 2.接口只是一种接口只是一种约定约定,接口接口本身不含半点实现代码本身不含半点实现代码,从而使不同语言编译下从而使不同语言编译下 的组件都能使用在同

6、一个软件下的组件都能使用在同一个软件下. 3.接口减少了模块间的耦合接口减少了模块间的耦合,增强了信息封装的能力增强了信息封装的能力.使结构合理使结构合理,清淅清淅. 13.1 面向组件编程思想面向组件编程思想 C#中中 接口与类的比较接口与类的比较: 1.接口只是一组方法的定义接口只是一组方法的定义,具体要通过类来实现具体要通过类来实现.即类可以通过接口即类可以通过接口”割割”开开 了一个窗口了一个窗口,透过它透过它,就可以使用类的具体功能就可以使用类的具体功能. 2.接口只关心接口只关心”接口的形状接口的形状”和和”数据线数据线”多少多少.但不关心实现但不关心实现(不能存储任何状不能存储任

7、何状 态态) 3.接口可以多重继承接口可以多重继承(相当于扩展了接口相当于扩展了接口)但类只允许单继承基类但类只允许单继承基类 (注意理解以下注意理解以下)在以后实践中你会发现在以后实践中你会发现- 4.组件通过接口实现的设计方法组件通过接口实现的设计方法,同样也可以能过类和继承同样也可以能过类和继承(多态性多态性)来实来实 现现! 但但 并不是每一门开发语言都是并不是每一门开发语言都是OOP的的,所以采用接口来实现具有普所以采用接口来实现具有普 遍性遍性 所以所以 - a.建议大家尽可能的使用接口来实现组件设计思想建议大家尽可能的使用接口来实现组件设计思想.特别是一些多语言特别是一些多语言

8、混合开发的项目混合开发的项目 b.尽量使用已大量发布或使用成熟的接口尽量使用已大量发布或使用成熟的接口,不得已下才自已定义新接不得已下才自已定义新接 口口 13.2 定义定义 n13.2.1 定义定义 13.2.2 继承继承 n13.2.3 接口成员的定义接口成员的定义 n13.2.4 结构结构的成员的定义的成员的定义 n13.2.5 练习练习 返回首页 13.2.1 定义定义 接口定义与类相似接口定义与类相似 它的它的一般一般定义格式如下:定义格式如下: 修饰符修饰符 interface :基接口基接口1,基接口基接口 2 new 方法成员方法成员; 注意: 需记住含义的接口修饰符: 1.访

9、问修饰符 public 2. 其它 new 成员访问性: 不允许显示声明,相当于public 接口的成员 只能是方法类的成员: 方法,属性,索引器,事件 返回上节 13.2.1 定义定义 例:例:下面是一个控件接口的定义。下面是一个控件接口的定义。 interface IContral void Paint(); 说明说明: 1.接口名建议以接口名建议以I打头打头,其它按类名命名规则其它按类名命名规则 2.成员不许出现访问修饰符成员不许出现访问修饰符 3.成员只能是成员只能是”方法方法”成员成员,且不许出现方法体且不许出现方法体 返回上节 13.2.2 继承继承 例:例:下面是下面是3个控件接

10、口的定义。个控件接口的定义。 interface IContral void Paint(); interface ITextBox:IContral void SetText(string text); interface IListBox:IContral void SetItems(string Items); 注意注意: 对一个接口进行继承也就继承了基接口的所有成员对一个接口进行继承也就继承了基接口的所有成员 返回上节 13.2.3 接口成员的定义接口成员的定义 例:例:下面是某个控件接口的定义。下面是某个控件接口的定义。 interface IExzample void F(); v

11、oid F(int value); string Pget;set; string thisint indexget;set; event EventHandler Click; 注意注意: : 1.1.接口成员前不能显示声明任何访问修饰符接口成员前不能显示声明任何访问修饰符, ,其默认访问为其默认访问为public public 2.2.接口成员前仅能显示的声明接口成员前仅能显示的声明new ,new ,用在隐藏基接口的同名方法成员用在隐藏基接口的同名方法成员 3.3.接口成员无法修饰成接口成员无法修饰成static,static,显然接口内成员的实现只能由显然接口内成员的实现只能由( (类

12、的类的) )对象来实现对象来实现 返回上节 13.2.4 接口成员的访问接口成员的访问 例例1: interface ISequence int Countget;set; interface IRing void Count(int i); interface IRingSequence:ISequence,IRing 假设假设 rs 是是 IRingSequence的一个引用的一个引用 rs.Count(1); /错误错误,Count 有二义性有二义性 rs.Count=1; /错误错误,Count 有二义性有二义性 (ISequence)rs).Count=1; /正确正确 (IRing

13、)rs).Count(1); /正确正确 注意:方法的重名带来了二义性,必须显式地访问该成员 返回上节 13.2.4 接口成员的访问接口成员的访问 例例2: interface IBase void Add(int i); interface ILeft : IBase new void Add(int i); interface IRight : IBase void G(); interface IDierived : ILeft , IRight 假设 n 是 IDierived的一个引用 n.Add(1); /正确,(如果ILeft不覆盖Add 则会产生了二义性) (IBase)n).

14、Add(1); /调用IBase (ILeft)n).Add(1); /调用ILeft (IRight)n).Add(1); /调用IBase 注意: 1.多重继承带来了二义性,必须显式地访问该成员 2.IBase的方法Add 在ILeft中被覆盖,IRight没覆盖. 但是一但成员被覆盖之后,所有对其的访问都会被 覆盖的成员给”挡截”了! 所以n.Add(1)并不会产生二义性 返回上节 13.3 实现实现 (可以类或结构中实现) 13.3.1 在类隐式实现在类隐式实现 不仅借用类,而且还借用了类的方法成员来实现 13.3.2 在类中显式实现在类中显式实现 仅仅借用类来实现 13.3.3 实现

15、的优先权实现的优先权 在类的继承体系中实现在类的继承体系中实现(隐隐/显显) 注意多态性对接口实现的影响,否则接口在”什么”类 实现就表现为”什么”! 返回上节 13.3.1 在类隐式实现在类隐式实现 例: interface ISequence object Add(int i); interface IRing int Insert(int i); class CRingSequence:ISequence,IRing public object Add(int i) Console.WriteLine(“ in Add”);return null; public int Insert(i

16、nt i)Console.WriteLine(“ in Insert”); return 0; IRing ir=new CRingSequence(); /ir.Add(1); /错误错误, ir.Insert(1); /正确正确 ISequence IS=(ISequence )ir; /指向同一个实例指向同一个实例 IS.Add(1); /正确正确 /IS.Insert(1); / 错误错误 CRingSequence cr=(CRingSequence)IS; cr.Add(1);/正常使用正常使用 cr.Insert(1);/正常使用正常使用 返回上节 13.3.2 在类显式实现在类

17、显式实现 例: interface ISequence object Add(int i); interface IRing int Insert(object obj); class CRingSequence:ISequence,IRing / public object Add(int i)Console.WriteLine(“ in Add”);return null; o b j e c t I S e q u e n c e . A d d ( i n t i) Console.WriteLine(“IS.CR in Add”);return null; int IRing.Ins

18、ert(object obj)Console.WriteLine(“ in Insert”);return 0; IRing ir=new CRingSequence(); /ir.Add(1); /错误, ir.Insert(1); /正确 ISequence IS=(ISequence )ir; /指向同一个实例 IS.Add(1); /正确 IS.Insert(1); / 错误 CRingSequence cr=(CRingSequence)IS; cr.Add(1);/错误,并没有这个成员 cr.Insert(1);/错误,并没有这个成员 返回上节 13.3.3 实现的优先权实现的优先

19、权 1. 当类中方法成员名与接口的显式实现同时存在时当类中方法成员名与接口的显式实现同时存在时,显式实现有优先显式实现有优先 权权 例例: interface IA void Fun(); class CA:IA public void Fun() Console.WriteLine(“Fun in CA”); void IA.Fun() /拥有优先权拥有优先权 Console.WriteLine(“IA.Fun in CA”); / IA ia=new CA(); ia.Fun();/显示显示 IA.Fun in CA 返回上节 13.3.3 实现的优先权实现的优先权 2.当类中实现多重接口

20、当类中实现多重接口,但接口之间有继承关系时但接口之间有继承关系时,相应方相应方 法只需实现一次法只需实现一次 例例: interface IA void Fun(); interface IB:IA class CA:IA,IB void IA.Fun() /只需只需(显式或隐式均可显式或隐式均可)实现一个接口成员实现一个接口成员 / IA的的Fun就行了就行了 Console.WriteLine(“IA.Fun in CA”); / IB ib=new CA(); ib.Fun();/显示显示 IA.Fun in CA /因为因为IB 继承了继承了IA接口接口 返回上节 13.3.3 实现的

21、优先权实现的优先权 3-a.当类有继承时当类有继承时,但接口是在基类实现时但接口是在基类实现时,派生类也会拥有这个接口派生类也会拥有这个接口 (派生类的同名方法不会改变接口的实现派生类的同名方法不会改变接口的实现,但小心但小心虚方法虚方法对接口实现的影响对接口实现的影响) 例例: interface IA void Fun(); class CA:IA /还是在还是在CA中实现中实现 public void Fun()Console.WriteLine(“Fun in CA”); class CB:CA /CB类从基类继承得到了这个类从基类继承得到了这个IA接口接口 public new vo

22、id Fun()Console.WriteLine(“Fun in CB”); /虽然从类的体系看虽然从类的体系看,此方法覆盖了基类的此方法覆盖了基类的Fun,但不会影响到但不会影响到IA的实现的实现 / IA ia=new CB(); ia.Fun();/显示显示 Fun in CA /虽然因为虽然因为IB 继承了继承了IA接口接口,但还在但还在CA中实现的中实现的! 返回上节 13.3.3 实现的优先权实现的优先权 3-b.当类有继承时当类有继承时,但接口是在基类实现时但接口是在基类实现时,派生类也会拥有这个接口派生类也会拥有这个接口 (派生类的同名方法不会改变接口的实现派生类的同名方法不

23、会改变接口的实现,但小心但小心虚方法虚方法对接口实现的影响对接口实现的影响) 例例: interface IA void Fun(); class CA:IA /还是在还是在CA中实现中实现 public virtual void Fun()Console.WriteLine(“Fun in CA”); class CB:CA /CB类从基类继承得到了这个类从基类继承得到了这个IA接口接口 public override void Fun()Console.WriteLine(“Fun in CB”); /虽然从类的体系看虽然从类的体系看,此方法此方法动态动态改写了基类的改写了基类的Fun,虽

24、然是在虽然是在IA的实现的实现, / IA ia=new CB(); ia.Fun();/显示显示 Fun in CB /虽然因为虽然因为IB 继承了继承了IA接口接口,但还在但还在CA中实现的中实现的,但受到了类体系中虚方但受到了类体系中虚方 法的影响法的影响 返回上节 13.3.3 实现的优先权实现的优先权 4-a.当类有继承当类有继承,接口又分别都在派生类和基类都实现时接口又分别都在派生类和基类都实现时,派生类中实现派生类中实现优先优先! 即使在基类中是显示实现的即使在基类中是显示实现的!且只会实现一次且只会实现一次 例例: interface IA void Fun(); class

25、CA:IA public void Fun()Console.WriteLine(“Fun in CA”); class CB:CA,IA /CB类只会实现一次类只会实现一次IA接口接口 public new void Fun()Console.WriteLine(“Fun in CB”); / IA ia=new CB(); ia.Fun();/显示显示 Fun in CB /虽然因为虽然因为IB或或IA都实现了都实现了IA接口接口,但优先在但优先在CB中实现中实现 返回上节 13.3.3 实现的优先权实现的优先权 4-b.当类有继承当类有继承,接口又分别都在派生类和基类都实现时接口又分别都

26、在派生类和基类都实现时,派生类中实现派生类中实现优先优先! 即使在基类中是显示实现的即使在基类中是显示实现的!且只会实现一次且只会实现一次 例例: interface IA void Fun(); class CA:IA public void IA.Fun()Console.WriteLine(“IA.Fun in CA”); class CB:CA,IA /CB类只会实现一次类只会实现一次IA接口接口 public void Fun()Console.WriteLine(“Fun in CB”); / CA ca=new CB() (IA)(CA)ca).Fun(); /显示显示Fun i

27、n CB /IA.Fun()实现被实现被”覆盖覆盖”了了,无法访问无法访问 返回上节 13.3.3 实现的优先权实现的优先权 4-c. 当类有继承当类有继承,接口又分别都在派生类和基类都实现时接口又分别都在派生类和基类都实现时,接口也有继承时接口也有继承时,派派 生类中实现优先生类中实现优先 例例: interface IA void Fun(); interface IB:IA class CA:IA public void IA.Fun()Console.WriteLine(“IA.Fun in CA”); class CB:CA,IB /CB类只会在此实现类只会在此实现IA接口一次接口一

28、次 public void Fun()Console.WriteLine(“Fun in CB”); / IB ib=new CB(); ib.Fun();/显示显示 Fun in CB /虽然虽然IA在在CA中实现过中实现过,但但CB仍然透过仍然透过IB,抢先实现了它抢先实现了它,所以所以IA在在CB中被中被 实现实现 返回上节 13.3.3 实现的优先权实现的优先权 4-d. 当类有继承当类有继承,接口又分别都在派生类和基类都实现时接口又分别都在派生类和基类都实现时,接口也有继承时接口也有继承时,派派 生类中实现优先生类中实现优先 例例: interface IA void Fun();

29、interface IB:IA class CA:IB public void IA.Fun()Console.WriteLine(“IA.Fun in CA”); class CB:CA,IA /IA与与IB的次序不会影响的次序不会影响IA接口优先在派生类中被实现接口优先在派生类中被实现 public void Fun()Console.WriteLine(“Fun in CB”); / IB ib=new CB(); ib.Fun();/显示显示 Fun in CB /虽然虽然IA在在CA中实现过中实现过,但但CB仍然透过仍然透过IB,抢先实现了它抢先实现了它,所以所以IA在在CB中被中被

30、 实现实现 返回上节 13.3.3 在类的继承体系中实现在类的继承体系中实现(隐式隐式) 例: interface ISequence void Add(int i); interface IRing void Insert(object obj); class CRingSequence:ISequence,IRing public void Add(int i) Console.WriteLine(“ in Add”); p u b l i c v i r t u a l v o i d I n s e r t ( o b j e c t obj)Console.WriteLine(“ i

31、n Add”); class CRR:CRingSequence public new void Add(int x) Console.WriteLine(“Add in CRR_Add”); public override void Insert(object obj) Console.WriteLine(“ Insert in CRR_Add”); ISequence IS=new CRR (); IS.Add(1);/ 显示显示 Add in Add 因为实现于因为实现于CRingSequence类中类中 (IRing)IS).Insert(null);/ 显示显示 Insert in CRR_Add 因为实现于因为实现于 CRingSequence类中类中,但受到了虚方法的影响但受到了虚方法的影响 返回上节 13.3.3 在类的继承体系中实现在类的继承体系中实现(显式显式) 例: interface ISequence void Add(int i); interface IRingSequence : ISequence class CRingSequence: IRingSequence v o i d I S e q u e n c e . A d d ( i n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论