1、接口可以进一步支持面向对象编程,接口其实是用来构建支持多种行为的类类型的。
2、.NET基础类库中定义了很多标准接口,我们自定义的类和结构可以实现这些预定义的接口,从而使得我们自定义的类或结构也支持对象克隆、对象枚举、对象排序等高级行为。
3、接口的定义:接口就是一组抽象成员的命名集合。接口成员总是抽象的,由每个类自己去实现这些方法。
接口可以被任何层次结构、任何命名空间、任何程序集中的任何类或结构来实现,接口具有较高的多态性。
4、自定义接口类型:
(1)所有的接口成员都是隐式公共的和抽象的;
(2)接口是纯粹的协议,接口不能包含字段、构造函数、函数实现,函数实现留给支持它的类或结构去实现;接口可以包含方法声明、属性、索引器、事件;
(3)实现接口是一个“要么全做要么全部做”的命题,支持接口的类或结构不能选择实现接口的哪些成员;
5、接口调用
(1)直接在支持该接口的类对象级别调用;
(2)直接利用接口调用;(或者将类对象显示转换成接口之后,再提取需要的接口使用)
eg:
static void Main(string[] args)
{
Hexagon h = new Hexagon();
Console.WriteLine("{0}", <span style="BACKGROUND-COLOR: #33ff33">h.Points</span>);// 1、直接在支持该接口的类对象级别调用;
Circle c = new Circle();
// 强制转换看结果
IPointy ip1 = null;
try
{
ip1 = <span style="BACKGROUND-COLOR: #33ff33">(IPointy)c</span>;//2、显示转换之后再使用
}
catch (InvalidCastException e)
{
Console.WriteLine(e.Message);
}
// as语句
IPointy ip2 = h as IPointy;
if (ip2 != null)
{
Console.WriteLine("{0}",<span style="BACKGROUND-COLOR: #33ff33">ip2.Points</span>);// 2、直接利用接口调用;
}
else
{
Console.WriteLine("2");
}
// is语句
Shape[] myShapes = new Shape[]{
new Hexagon(),new Circle(),new Triangle("Joe"),new Circle("Joe")
};
for (int i = 0; i < myShapes.Length; i++)
{
myShapes[i].Draw();
if (myShapes[i] is IPointy)
{
Console.WriteLine("{0}",((IPointy)myShapes[i]).Points);
}
else
{
Console.WriteLine("not a IPointy!");
}
}
}
(3)如何判断类型是否支持某个接口,有三种方法:强制转换看结果、as语句、is语句;
6、接口作为参数:如果参数为接口,则任何支持该接口的类对象均可作为参数传递;
7、接口类型数组:同上,可以存储任何支持该接口的类对象;
8、显示接口实现,用于何处?
一个类可以支持多个接口,如果这些接口包含重名成员,这是就需要用到接口的显示实现。如下例:
9、接口继承:接口可以继承,接口可进行多重继承,即一个接口可以继承多个接口;
10、何时使用接口呢?
11、构建可枚举类型:类需支持IEnumerable接口;
构建可克隆类型:类需支持ICloneable接口;
构建可比较类型:类需支持IComparable接口;