以下是学习.NET基础课程接口部分笔记,基本说明了接口的的概念、作用、使用方法。
接口
- 接口使用interface关键字修饰
- 接口的命名Ixxxable,表示一种能力
- 接口不能被实例化
- 接口的本质是一个抽象类,接口是一个特殊的抽象类
因此
1.接口不能实例化
抽象类无法实例化
2.接口中可以定义抽象成员(这是abstract类的特性)
但是接口的特殊就在于:所有的方法默认都是public abstract方法,都不能写pulic,abstract关键字了
3.抽象成员不能有访问修饰符,默认就是abstract
接口中只能定义 属性 方法 索引器 事件(属性 索引器 和事件的本质也是方法)(类中可以定义的成员本质上就两种 一个是字段一个是方法(属性 索引器 事件 方法的其他形式))
接口中的成员默认就是抽象成员,默认就是public的,不能有访问修饰符
重要:接口就是一个纯粹的用来规范实现类的一个东西,他的作用仅仅是告诉实现这个接口的类,你应该有什么样的功能,至少要实现一些什么样的功能
由于接口是抽象的,所以所有实现接口的类中必须实现接口的所有抽象成员(因为他是一个规范,必须全部满足 全部实现,一个不实现就报错)
类实现接口的写法
- interface IRunale
- {
- string Name{get;set;} //这个不是自动属性(自动属性是定义在非接口的一些类中,会自动生成一个属性。但是在这里只是一个普通属性,只不过set和get是空方法体,等着实现该接口的类去实现)
- //这里的属性是一个普通的属性,只是一个被定义为abstract的一个普通属性,而不是一个普通类的自动属性
- //自动属性必须同时声明get和set访问器,缺一个都不行,如果缺少了get或者set必须把另一个设置为普通访问器,就是给他加上方法体
- void Run();
- }
- //这叫做Person类实现了IRunable接口,完全可以将接口理解成父类
- //翻译过来就是:人类实现了Run这种能力
- class Person:IRunable
- {
- //实现接口的抽象成员,不需要写override关键字,只需要像正常定义成员一样
- //但是实现了接口的类必须试下这个接口所有的成员
- public string Name{get;set;}
- public void Run()
- {
- cw("I am Running!!");
- }
- }
- 接口不能被实例化
- 比如有这么一个接口
- interface IRunable
- {
- string Name{set;get;}
- void Run();
- }
复制代码
注意事项:
不能通过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("在我这里最终实现了唱歌的方法") } }
显示实现接口,是为了要实现的方法名和已存在的方法名冲突的问题
显示实现接口,实现的方法是私有的,因此无法通过子类变量来调用,而可以通过接口的变量来调用
接口的补充和使用接口要注意的问题(使用接口要注意的问题)
面向抽象的程序设计(使用接口 抽象类 父类)不关心具体的实现 是未来编程的发展方向
在编程时,要遵循 接口-抽象类-父类-具体类 的模式转变
能使用接口尽量不使用抽象类,能使用抽象类尽量不使用父类,能使用父类尽量不使用具体类
一切为了多态可扩展,代码重用性,灵活,开闭原则。。接近人类的思维的方向发展
单一职责原则: 尽量不要定义体积庞大的接口(接口污染),一个接口一般定义一个或者少量几个方法
小接口组合使用,就像活字印刷术一样
|
|