1, 接口的定义?
答:接口表示一组函数成员而不实现成员的引用类型,类和结构可以实现接口。
2, 接口的意义及为什么要使用接口?
要理解接口的意义以及为什么它是有用的,让我们先来看看下面的代码,它接受了一个没有排序的整数数组并且按升序进行排序。
class Program { static voidMain(string[] args) { var myInt = new[] { 20,4,16,9,2};//隐式创建整形数组。 Array.Sort(myInt);//调用Array类的Sort方法对数组进行排序,默认为升序。 foreach (var item in myInt)//使用foreach语句遍历数组。 { Console.Write("{0}",item); Console.Write(""); } Console.ReadKey(); } }
程序输出结果为:
Sort方法在int数组上工作得很好,但是如果我们尝试在自己的类上使用会发生什么样的结果呢?如下代码所示:
class Program { static voidMain(string[] args) { var myInt=new []{ 20,4,16,9,2};//隐式创建整形数组。 MyClass[] mc=new MyClass[5];//创建MyClass对象数组。 for (int i = 0; i < 5; i++)//初始化数组 { mc[i] = new MyClass(); mc[i].TheValue=myInt[i]; } Array.Sort(mc);//调用Sort方法时会引发异常。 foreach (var item in mc) { Console.Write("{0}",item); Console.Write(""); } Console.ReadKey(); } } class MyClass//自定义类MyClass { public int TheValue; }
程序会抛出一个异常,如下图:
这是什么原因呢?Sort不工作的原因是,对于用户自定义对象的数组而言,它不知道如何比较用户自定义对象和确定它们的次序,它需要数组中的对象实现IComparable接口。在Sort运行时,它通过调用元素的CompareTo方法并传入另外一个元素的引用作为参数来实现数组的一个元素和另一个元素的比较。
所以,我们可以通过让类实现IComparable接口来使Sort方法可以用于MyClass对象。
代码如下:
class Program { static voidMain(string[] args) { var myInt = new[] { 20,4,16,9,2}; MyClass[] mc = new MyClass[5]; //创建类MyClass对象的数组。 for (int i = 0; i < 5; i++) //初始化数组 { mc[i] = new MyClass(); mc[i].TheValue=myInt[i]; } PrintOut("原始数组顺序:", mc);//调用静态PrintOut方法输出初始数组。 Array.Sort(mc); PrintOut("经过Sort后的顺序:", mc);//调用静态PrintOut方法输出排序后的数组。 Console.ReadKey(); } static void PrintOut(string s, MyClass[] mc)//定义静态方法PrintOut实现遍历数组并输出数组元素。 { Console.Write(s); foreach (var item in mc) { Console.Write("{0}",item.TheValue); Console.Write(""); } Console.WriteLine();//换行 } } class MyClass : IComparable //类实现接口 { public int TheValue; public int CompareTo(object obj) //接口成员方法实现 { MyClass mc=(MyClass)obj; if (this.TheValue < mc.TheValue) return -1; if (this.TheValue > mc.TheValue) return 1; return 0; } }
程序输出结果为:
在MyClass类中实现接口IComparable接口的示意图:
3, 声明接口?
例如:
interface IMyInterface1 //声明接口IMyInterface1 { int Do1(int i, long l); double Do2(string s, long l); }
需要注意以下几点:
1> 声明接口使用interface关键字。
2> 接口名称必须从大写的I开始(如:ISaveable)。
3> 接口函数成员的声明不能包括任何实现代码,而在每一个成员声明的主体的后面必须使用分号。
4> 接口声明可以有任何的访问修饰符public,protected,private等,但是接口的成员是隐式public的,不允许有任何访问修饰符,包括public。
4, 实现接口?
只有类和结构才能实现接口。要实现接口,类或结构必须注意以下几点:
1> 在基类列表中包括接口名称。
2> 为每一个接口的成员提供实现。
3> 如果类从基类继承并实现接口,基类列表中的基类名称必须放在任何接口之前。
例如:
interface IMyInterface1 //声明接口IMyInterface1 { int Do1(int i, long l); double Do2(string s, long l); } class MyClass : IMyInterface1 //实现接口 { int Do1(int i, long l) //实现接口成员 { //todo:方法体 } double Do2(string s,long l) { //todo:方法体 } }
5, 简单接口的示例?
代码如下:
interface IIfc1 //声明接口 { void PrintOut(string s); } class MyClass : IIfc1 //实现接口。 { public void PrintOut(string s) //实现接口成员 { Console.WriteLine("Calling through:{0}",s); Console.ReadKey(); } } class Program { static voidMain(string[] args) { MyClass mc = new MyClass(); //创建实例 mc.PrintOut("object"); //调用类对象的方法。 } }
程序输出结果为:
以上是我的简单总结,今天先写到这儿,欢迎大家点评,谢谢!