一直对接口半生不熟,我想一些像我一样的新手也有同样的困惑。下面系统复习下咯。有异议或疑惑的欢迎讨论咯~
.net基类库中有很多预定义的标准接口,我们自己的自定义类型完全可以实现这些预定义的接口,来支持对喜那个克隆、对象枚举和对象排序。
接口就是一组抽象成员的集合。接口里的成员不能有访问修饰符,并且方法不能有实现。
接口对比抽象基类,有一个面向对象的体系,如果用抽象基类来实现多态接口,意味着所有的子类都有这个“接口”的特性;如果是接口作为动态接口,那么只是实现它的类才需要实现方法,而这个实现接口的l类的子类从概念并不是接口的孙类。并且接口能作为多个面向对象体系的多态接口,而不是建造一个共有的超类。在我看来,接口更轻便与灵活,定义了一个规范,所以“继承”接口不是继承,而是实现。
注意:c#在新建一个类时,是自动继承Object的,而接口没有自动继承任何基类。
如果将类对象转换它不支持的接口,会引发异常,可以用try/catch来捕获,但更好的解决方案是判断是否支持某个接口,两种方法:as和is:
as:
Hexagon hex1=new Hexagon("Peter");
IPointy itfpt2=hex1 as IPointy;//如果不支持IPointy返回nul
if(itfpt2 !=null){
...//按照逻辑继续代码
}
else { ...//不支持此接口的处理方案 }
is:
Hexagon hex1=new Hexagon("Peter");
if(hex1 is IPointy){...}
接口可以组织接口层次结构,和类层次相似,如果接口扩展了既有接口,它就继承了父类型定义的抽象成员。和基于类的继承不同的是,派生接口不会实现抽象成员,只是拓展了本身,即继承了父类型的成,不用实现它们。所以,一个孙类继承了父接口,而这个父接口继承了超接口,那么孙类就必须实现父接口和超接口的方法。
接口在以下情况下特别有用: