本文意在巩固基础知识,并不是对其进行深入剖析,还望理解。
本文为原创文,难免会有一些小得瑕疵,敬请谅解。
所有示例均是博主测试过的,如有转载请标明出处,谢谢。
在编程中,我们经常会用到接口,那什么是接口呢?
接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。
接口使用interface 关键字进行定义,可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。
接口的特性:
1、接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员:
当显式实现该接口的成员时,实现的成员不能通过类实例访问,只能通过接口实例访问。
当隐式实现该接口的成员时,实现的成员可以通过类实例访问,也可以通过接口实例访问,但是实现的成员必须是公有的。
2、接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。
3、接口成员是自动公开的,且不能包含任何访问修饰符。
4、接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。
为什么不能指定接口中方法的修饰符?(面试题)
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。它们默认为公有方法。
interface IProgram { void Fun(); } class Program:IProgram { //显式实现接口成员 void IProgram.Fun() { Console.WriteLine("I am Fun."); } static void Main(string[] args) { IProgram p = new Program(); //声明一个接口实例,但不是对接口进行实例化 p.Fun(); Console.Read(); } } |
上面提到,实现接口可以显式实现和隐式实现,那么这两种实现到底有什么优缺点呢?
一般情况,当类或者结构要实现的是单个接口,可以使用隐式实现。
如果类或者结构继承了多个接口且接口中具有相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。
interface IProgram { void Fun(); } interface IAProgram { void Fun(); } class Program : IProgram, IAProgram { void IProgram.Fun() //显式实现接口IProgram { Console.WriteLine("I am IProgram Fun."); } void IAProgram.Fun() //显式实现接口IAProgram { Console.WriteLine("I am IAProgram Fun."); } //public void Fun() //隐式实现接口 //{ // Console.WriteLine("I am Program Fun."); //} static void Main(string[] args) { //IProgram p = new Program(); //p.Fun(); //IAProgram ap = new Program(); //ap.Fun(); Program pro = new Program(); ((IProgram)pro).Fun(); ((IAProgram)pro).Fun(); Console.Read(); } } |
结果为:I am IProgram Fun.
I am IAProgram Fun.