《2022年面向对象中的接口 .pdf》由会员分享,可在线阅读,更多相关《2022年面向对象中的接口 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象中的接口#region接口/interface-接口/接口的关键字:interface 接口中定义未实现的方法(不指定具体的实现=操作)。/接口中可以包含:属性、方法、事件、索引器不能包含字段/接口是一套规范,遵守这个规范就可以实现功能/-/接口具有下列属性:/接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。/不能直接实例化接口。/接口可以包含事件、索引器、方法和属性。/接口不包含方法的实现。/类和结构可从多个接口继承。/接口自身可从多个接口继承。/-/抽象类可以约束【子类】的行为,是类的模板。/接口可以约束类的行为,它是【跨类】的。是所有要实现此接口的类的一组规
2、范/Student、Person 是类,IComparable,IOtherInterface是接口/class Student:Person,IComparable,IOtherInterface /-同时继承类和实现接口的时候,父类要写在接口的前面/可以实现多个接口,只能继承自一个类。(C#中的单根性)/正确的说法:继承了一个类,实现了一个接口/C#中一个类只能继承一个父类/接口可以说是对继承单根性的扩展/接口提供了一组规范,一个标准/接口屏蔽了实现的细节-Sort方法排序时,无需关心IComparable 如何实现/方便多人协同开发 -可以一组人实现IComparable,一组人去做排序
3、功能/接口描述了一个对象的特征/传递接口就是传递了实现接口的对象/接口作为参数 -传递了实现接口的对象/接口作为返回值-返回一个实现了接口的对象/继承中 is a 的关系 -子类 is a 父类,体现继承关系,我们可以用父类来统一子类的类型.名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 9 页 -/接口可以理解为 can do-可以做什么,只要有某些类实现了某个接口,就具备了相应的功能.(就可以做那些事情)./-/当一些子类继承父类的时候,那么这些子类就只能有一个父类(单根性)。/面向对象中对子类进行抽象,其实是对这些子类归类。根据单根性,归类只能归为一类(越往顶层越抽象)。/
4、在做项目时,我们一般都会先抽离出对象(分析角色,分析系统中包含的对象),然后用类来描述(编写具体的类)/然后,会发现这些对象都有一些明显的共同的特征,这时候抽象出基类(继承),为了实现多态性,基类使用抽象类来描述。/在设计过程中,会发现这些抽离出来的对象(子类)归类的时候,并不属于同一个类别(有多个父类),这时候就有冲突了,/这时候,在设计中使用接口(可以实现多个接口),来解决此问题。接口可以说是对继承单根性的扩展/再者,举例:比如说鸟类(父类),在鸟类下衍生出,麻雀(子类),天鹅(子类);/鸟类是会飞的,那么麻雀和天鹅都可以继承会飞的这个方法,/这时候,鸟类(父类)用抽象类来描述,鸟类中包含
5、一个抽象方法 -飞,/子类麻雀、天鹅都必须实现此抽象方法(使用 override重写父类的方法-实现多态性)/如 示例 1:#region示例 1publicabstractclassBirds publicabstractvoid Fly();/Sparrow-麻雀publicclassSparrows :Birds publicoverridevoid Fly()Console.WriteLine(麻雀飞);/Swan-天鹅publicclassSwans :Birds publicoverridevoid Fly()Console.WriteLine(天鹅飞);名师资料总结-精品资料欢迎
6、下载-名师精心整理-第 2 页,共 9 页 -#endregion/这是没有问题的,但是现在:/鸟类中,鸡也是鸟类,鸵鸟也是鸟类/但鸡和鸵鸟是不会飞的。/计算机是用来模拟现实生活中的人和事物,/面向对象用计算机语言来模拟实现现实世界,在这种情况下,存在冲突,如何解决。/-接口/如示例 2:#region示例 2publicinterfaceIBrid void CanFly();publicabstractclassBird publicabstractvoid Sleep();/Sparrow-麻雀publicclassSparrow :Bird,IBrid publicoverridevo
7、id Sleep()Console.WriteLine();#region IBrid 成员publicvoid CanFly()Console.WriteLine(麻雀会飞);#endregion /Swan-天鹅publicclassSwan :Bird,IBrid publicoverridevoid Sleep()Console.WriteLine();名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 9 页 -#region IBrid 成员publicvoid CanFly()Console.WriteLine(天鹅会飞);#endregion /Ostrich-鸵鸟p
8、ublicclassOstrich :Bird publicoverridevoid Sleep()thrownew NotImplementedException();/Chook-鸡publicclassChook:Bird publicoverridevoid Sleep()thrownew NotImplementedException();#endregion/这样的话,麻雀和天鹅会飞,那就实现 IBird 接口,鸡和鸵鸟不会飞,那就不用实现IBrid 接口/但这些子类(麻雀、天鹅、鸡、鸵鸟)都是鸟类,/-同时继承了鸟类(Bird 这些子类都是鸟,-is a的关系 -子类 is a
9、父类,LSP【里氏替换原则】),/又解决了会飞和不会飞的情况(实现了 IBrid 就会飞,不实现则不会,同时实现了多态性)。/-这就是接口的好处,和使用场合。/注意:接口和基类在同一级别,基类必须写在接口的前面。/既然接口又这么多好处,那么在设计时基类全部用接口实现可以吗?/答案是可以的,但:/如果所有的基类都用接口代替的话,那么,每当有一个对象想具有某种特征(每有一个类想具有某种行为)的时候,/都需要实现接口中所有的操作(未实现的方法)。这么做很麻烦;/而且,有些时候,我们只想让对象拥有接口中某个特征的话,这样做,无疑浪费资名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页
10、 -源,浪费精力。/这样的话,就像示例 2 中的代码所示,把某些共有的特征放在基类中,把某些(有些子类可能用到的特征)特征放到接口中/这样符合现实情况,解决冲突问题。是一种好的解决方案。/另外:两个类别无关,行为相似,这样要抽象出基类的时候,无法完成,此时使用接口来解决这个问题。/例如:飞机和天鹅都会飞,而又无法抽象出基类,这时候永接口更好。/#region接口的定义、实现publicinterfaceITestInterFace /接口中的成员默认是Public,不需要写访问修饰符/方法-未实现的方法可以称为:操作void Add();int Hello(string str);string
11、 GetName(string names);/属性string Name get;set;/事件eventEventHandler MyEventHandler;/索引器stringthis int index get;set;publicclassTestInterFace:ITestInterFace /接口中的成员必须全部实现#region ITestInterFace 成员publicvoid Add()thrownew NotImplementedException();名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 9 页 -publicint Hello(stri
12、ng str)thrownew NotImplementedException();publicstring GetName(string names)thrownew NotImplementedException();publicstring Name get thrownew NotImplementedException();set thrownew NotImplementedException();publiceventEventHandler MyEventHandler;publicstringthis int index get thrownew NotImplemented
13、Exception();set thrownew NotImplementedException();#endregion#endregion#region实现 IComparable 排序接口,实现排序功能publicclassSortPerson :IComparable publicint Age get;set;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 9 页 -publicstring Name get;set;publicint Score get;set;public SortPerson(string name,int age,int score)this.
14、Name=name;this.Age=age;this.Score=score;#region IComparable 成员publicint CompareTo(Person other)returnthis.Name.CompareTo(other.Name);#endregion publicclassTestSort publicvoid SortPersonByName()List perList=new List new SortPerson(张三 ,34,44),new SortPerson(里斯 ,21,65),new SortPerson(王五 ,32,99),new Sor
15、tPerson(赵六 ,22,88);perList.Sort();#endregion#region实现 IComparer比较器接口,实现排序功能publicclassSortPersons publicint Age get;set;publicstring Name get;set;publicint Score get;set;public SortPersons(string name,int age,int score)this.Name=name;this.Age=age;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 9 页 -this.Score=score;
16、publicclassSortPersonByAge :IComparer#region IComparer 成员publicint Compare(SortPersons x,SortPersons y)return x.Age.CompareTo(y.Age);#endregion publicclassSortPersonByScore:IComparer#region IComparer 成员publicint Compare(SortPersons x,SortPersons y)return x.Score.CompareTo(y.Score);#endregion publicc
17、lassSortPersonByName:IComparer#region IComparer 成员publicint Compare(SortPersons x,SortPersons y)return x.Name.CompareTo(y.Name);#endregion publicclassTestSortPer publicvoid SortPersonByName()名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 9 页 -List perList=new List new SortPersons(张三,34,44),new SortPersons(里斯,21,65)
18、,new SortPersons(王五,32,99),new SortPersons(赵六,22,88);perList.Sort(new SortPersonByName();perList.Sort(new SortPersonByAge();perList.Sort(new SortPersonByScore();foreach (SortPersons per in perList)Console.WriteLine(姓名:0t年龄:1t分数:2);Console.Read();#endregion#endregion名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 9 页 -