接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。
这种描述比较抽象,直接来看个示例。
下例中,Main方法创建并初始化了一个CA类的对象,并将该对象传递给PrintInfo方法。
class CA { public string Name; public int Age; } class CB { public string First; public string Last; public double PersonsAge; } class Program { static void PrintInfo(CA item) { Console.WriteLine("Name: {0},Age {1}",item.Name,item.Age); } static void Main() { CA a=new CA(){Name="John Doe",Age=35}; PrintInfo(a); } }
只要传入的是CA类型的对象,PrintInfo就能正常工作。但如果传入的是CB,就不行了。
现在的代码不能满足上面的需求,原因有很多。
PrintInfo的形参指明了实参必须为CA类型的对象
CB的结构与CA不同,字段的名称和类型与CA不一样
接口解决了这一问题。
声明一个IInfo接口,包含两个方法–GetName和GetAge,每个方法都返回string
类CA和CB各自实现了IInfo接口,并实现了两个方法
Main创建了CA和CB的实例,并传入PrintInfo
由于类实例实现了接口,PrintInfo可以调用那两个方法,每个类实例执行各自的方法,就好像是执行自己类声明中的方法
interface IInfo //声明接口 { string GetName(); string GetAge(); } class CA:IInfo //声明了实现接口的CA类 { public string Name; public int Age; public string GetName(){return Name;} public string GetAge(){return Age.ToString();} } class CB:IInfo //声明了实现接口的CB类 { public string First; public string Last; public double PersonsAge; public string GetName(){return First+""+Last;} public string GetAge(){return PersonsAge.ToString();} } class Program { static void PrintInfo(IInfo item) { Console.WriteLine("Name: {0},Age {1}",item.GetName(),item.GetAge()); } static void Main() { var a=new CA(){Name="John Doe",Age=35}; var b=new CB(){First="Jane",Last="Doe",PersonsAge=33}; PrintInfo(a); PrintInfo(b); } }
使用IComparable接口的示例第一行代码创建了包含5个无序整数的数组
第二行代码使用了Array类的静态Sort方法来排序元素
用foreach循环输出它们,显式以升序排序的数字
var myInt=new[]{20,4,16,9,2}; Array.Sort(myInt); foreach(var i in myInt) { Console.WriteLine("{0}",i); }
Sort方法在int数组上工作良好,但如果我们尝试在自己的类上使用会发生什么呢?
class MyClass { public int TheValue; } ... MyClass[] mc=new MyClass[5]; ... Array.Sort(mc);
运行上面的代码,将会得到一个异常。Sort并不能对MyClass对象数组排序,因为它不知道如何比较自定义的对象。Array类的Sort方法其实依赖于一个叫做IComparable的接口,它声明在BCL中,包含唯一的方法CompareTo。
public interface IComparable { int CompareTo(object obj); }
尽管接口声明中没有为CompareTo方法提供实现,但IComparable接口的.NET文档中描述了该方法应该做的事情,可以在创建实现该接口的类或结构时参考。
文档中写到,在调用CompareTo方法时,它应该返回以下几个值:
负数值 当前对象小于参数对象
整数值 当前对象大于参数对象
零 两个对象相等
我们可以通过让类实现IComparable来使Sort方法可以用于MyClass对象。要实现一个接口,类或结构必须做两件事情:
必须在基类列表后面列出接口名称
必须实现接口的每个成员
例:MyClass中实现了IComparable接口