A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heshiwei 高级黑马   /  2015-9-30 10:09  /  518 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是学习.NET基础课程接口部分笔记,基本说明了接口的的概念、作用、使用方法。

接口
  •         接口使用interface关键字修饰
  •         接口的命名Ixxxable,表示一种能力
  •         接口不能被实例化
  •         接口的本质是一个抽象类,接口是一个特殊的抽象类

                因此
                        1.接口不能实例化
                            抽象类无法实例化
                        2.接口中可以定义抽象成员(这是abstract类的特性)
                            但是接口的特殊就在于:所有的方法默认都是public abstract方法,都不能写pulic,abstract关键字了
                        3.抽象成员不能有访问修饰符,默认就是abstract
       

       接口中只能定义 属性 方法  索引器 事件(属性 索引器 和事件的本质也是方法)(类中可以定义的成员本质上就两种 一个是字段一个是方法(属性 索引器 事件 方法的其他形式))
        接口中的成员默认就是抽象成员,默认就是public的,不能有访问修饰符

       重要:接口就是一个纯粹的用来规范实现类的一个东西,他的作用仅仅是告诉实现这个接口的类,你应该有什么样的功能,至少要实现一些什么样的功能

        由于接口是抽象的,所以所有实现接口的类中必须实现接口的所有抽象成员(因为他是一个规范,必须全部满足 全部实现,一个不实现就报错)

类实现接口的写法
  1. interface IRunale
  2. {
  3.   string Name{get;set;} //这个不是自动属性(自动属性是定义在非接口的一些类中,会自动生成一个属性。但是在这里只是一个普通属性,只不过set和get是空方法体,等着实现该接口的类去实现)
  4.                         //这里的属性是一个普通的属性,只是一个被定义为abstract的一个普通属性,而不是一个普通类的自动属性
  5.                         //自动属性必须同时声明get和set访问器,缺一个都不行,如果缺少了get或者set必须把另一个设置为普通访问器,就是给他加上方法体
  6.   void Run();
  7. }

  8. //这叫做Person类实现了IRunable接口,完全可以将接口理解成父类
  9. //翻译过来就是:人类实现了Run这种能力
  10. class Person:IRunable
  11. {
  12.   //实现接口的抽象成员,不需要写override关键字,只需要像正常定义成员一样
  13.   //但是实现了接口的类必须试下这个接口所有的成员
  14.   public string Name{get;set;}
  15.   public void Run()
  16.   {
  17.     cw("I am Running!!");
  18.   }
  19. }

  20. 接口不能被实例化
  21. 比如有这么一个接口
  22. interface IRunable
  23. {
  24.   string Name{set;get;}
  25.   void Run();
  26. }
复制代码



注意事项:
不能通过new实例化一个接口对象 IRunable run = new IRunable(); //这样是错误的 但是可以把接口看出父类,用父类的变量指向子类的对象,类似于lsp
IRunable run = new Person(); //这是可以的但是这种情况下,就像lsp那样通过父类变量访问子类的对象,只能访问到子类对象中的父类部分
接口也是一样通过接口访问它指向的子类对象,只能访问到在接口中规定要实现的那些方法


接口是为了多态
继承是为了多态
虚方法是为了多态
        --都是为了多态


什么时候用接口
        找不到某些类的父类,但是这些类拥有相同的某中能力。可以使用接口
什么时候用抽象类
        可以找到某些类的父类,拥有共同的属性,和多个方法,也适合从抽象类继承一些字段,那么可以使用抽象类

很形象地说明接口的作用的一个例子
超人 鸟  飞机(都会飞)

补充
        一个类只能有一个父类,但是可以实现多个接口,父类要写在第一个位置(父类必须在任何接口之前),接下来写接口,用逗号分隔
        接口在一定程度上解决了 类继承单根性的问题
        接口可以继承其他接口,可以继承多个其他的接口,支持多继承
        注意:接口的抽象方法也可以被实现接口的类实现为抽象方法或者虚方法,等到下一个子类去具体实现,这样语法也不会有错误,而且解决了我之前的问题
        interface ISingable{ void Sing(); }
        class Animal:ISingable{ public abstract void Sing(); }
        class Bird:Animal{ public override void Sing(){ cw("在我这里最终实现了唱歌的方法") } }

        显示实现接口,是为了要实现的方法名和已存在的方法名冲突的问题
        显示实现接口,实现的方法是私有的,因此无法通过子类变量来调用,而可以通过接口的变量来调用


接口的补充和使用接口要注意的问题(使用接口要注意的问题)
        面向抽象的程序设计(使用接口 抽象类 父类)不关心具体的实现 是未来编程的发展方向

        在编程时,要遵循 接口-抽象类-父类-具体类  的模式转变
                能使用接口尽量不使用抽象类,能使用抽象类尽量不使用父类,能使用父类尽量不使用具体类
                一切为了多态可扩展,代码重用性,灵活,开闭原则。。接近人类的思维的方向发展

        单一职责原则: 尽量不要定义体积庞大的接口(接口污染),一个接口一般定义一个或者少量几个方法
                        小接口组合使用,就像活字印刷术一样

3 个回复

倒序浏览
学习了 谢谢!!~
回复 使用道具 举报
收藏了,以后学到了看看
回复 使用道具 举报
哇 总结的好全,好多知识第一次听到,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马