C# 接口学习
最近看《大话设计模式》中有的地方使用抽象类,有的地方使用接口,一直在想到底在什么地方使用抽象类,在什么地方使用接口。在下面将接口和抽象类的特点和区别做一个总结,以供日后复习使用。首先先写下对接口的收集到的知识。
接口是为一个行为提供相应的规范和规定,微软的自定义接口总是后带able字段,证明其表述有同样“我能做……”行为的类。接口大多数是在关系疏松但都实现某一功能的类中。
一、接口的特点
1、接口是引用类型。
2、接口不能被实例化。
3、接口包含未实现的方法声明。
4、接口除了包含方法以外,可以包括属性、索引器、事件,并且这些成员都必须是公有的(Public)。但是不能包括:常量、域、构造函数、静态成员。
5、派生类必须实现接口中的所有成员(不仅是方法,还包括其它成员)。
6、一个类可以直接继承多个接口。
二、接口的使用
1、在创建的功能将在大范围的不同对象中使用的时候,使用接口。
2、设计小而简练的功能块,使用接口。
3、接口适用与为不相关的类提供通用的功能。
三、示例
1、形象的比喻。飞机会飞,鸟会飞,他们都继承了同一个接口“飞”。
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IFlyable plane = new Plane(); plane.fly(); IFlyable bird = new Bird(); bird.fly(); Console.ReadKey(); } } interface IFlyable { void fly(); } class Plane : IFlyable { public void fly() { Console.WriteLine("I'm a plane,I'm flying!!"); } } class Bird : IFlyable { public void fly() { Console.WriteLine("I'm a bird,I can Fly!!"); } } }
2、私有方法不能呢个实现接口方法
如果想将接口方法直接实现为私有方法是办不到的。下面的EditBox的代码中的Paint方法没有特殊说明,默认为Private,导致代码无法执行。
接口方法的实现通常是通过类中的公有方法实现的;在一些特殊情况下(代码隐藏、一个类实现的两个接口具有相同的接口方法等),需要专门实现某个接口的方法。
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { EditBox editBox = new EditBox(); editBox.ShowPaint(); } } interface IControlable { void Paint(); } public class EditBox : IControlable { void Paint() { Console.WriteLine("Pain method is called!"); } public void ShowPaint() { this.Paint(); ((IControlable)this).Paint(); } } }
程序在编译的时候显示出编译错误:
这是由于接口规范中的方法默认的访问权限是Public,而类中的默认访问权限是default,也就是Private,因此导致权限范围收缩,两者权限不相同,所以必须将类的权限调整为Public才可以使上面的代码得以执行。
3、实现专门的接口方法-1
代码:
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { EditBox editBox = new EditBox(); editBox.ShowPaint(); Console.ReadLine(); } } interface IControlable { void Paint(); } public class EditBox : IControlable { void Paint() { Console.WriteLine("Pain method is called!"); } void IControlable.Paint() { Console.WriteLine("IControlable.Pain method is called."); } public void ShowPaint() { this.Paint(); ((IControlable)this).Paint(); } } }
输出结果:
注意:在 void IControlable.Paint() 前不能加任何的修饰限定符号,诸如Public、Private等。