接口类型
接口就是一组抽象成员的命名集合。接口表示某各类或结构可以选择去实现的行为。接口成员总是抽象的(隐式公共的)。
定义接口成员时,不需要为这个成员定义实现作用域。接口是纯粹的协议,因此也不会定义实现。
判断类型是否引用接口可以用as和is关键字。
如果要实现具有相同成员的接口,可以使用显式接口实现语法来解决这种命名冲突(InterfaceName.Methodname(params){})。显示实现的成员是自动私有的。
接口可以组织成接口层次结构。和类层次结构相似,如果接口扩展了既有接口,他就继承了父类定义的抽象成员。当然,和基于类的继承不同的是,派生接口不会继承真正的实现,而只是通过额外的抽象成员扩展了其自身的定义。
接口类型和抽象基类区别
如果类被标记为抽象的,他可以定义许多抽象成员类为所有派生类型提供多态接口。然而,虽然类定义了一组抽象成员,它完全可以在定义许多构造函数、字段数据、非抽象成员(具有实现的)等。
而接口,只能包含抽象成员。
和类类型不同,一个接口可以扩展多个基接口。
有抽象父类创建的多态接口有一个主要限制,那就是只有派生类型才支持由抽象父类定义的成员。
使用场景
只有一个层次结构,但是只有一个派生类型的子集支持公共行为。
需要构建的公共行为跨多个层次结构,而且除了System.Object以外,没有其他公共父类。
IEnumerable和IEnumerator
//这个接口告知调用方对象的子项可以枚举 public interface IEnumerable { IEnumerator GetEnumerator(); } //这个接口允许调用方获取一个容器的子项 public interface IEnumerator { bool MoveNext(); //将光标的内部位置向前移动 object Current {get;} //获取当前的项 void Reset(); //将光标重置到第一个成员前面 }
任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算。
yield关键字
迭代器,他制定了容器内部项被foreach处理时该如何返回。虽然迭代器方法还必须命名为GetEnumerator(),返回值还是必须为IEnumerator类型,但自定义类不需要实现原来那些接口了。
public class Garage:Ienumerator { private Car[] carArray=new Car[4]; public IEnumerator GetEnumerator() { foreach(Car c in carArray) { yield return c; } } }
yield关键字从技术上说可以结合任何方法一起使用,无论方法名是什么。这些方法(技术上成为命名迭代器)独特之处在于可以接受许多参数。如果构建命名迭代器的话,需要知道这些方法会返回Ienumerable接口,而不是预计的IEnumerator兼容类型。
如果自定义类型要和C#的foreach关键字一起使用的话,容器就需要顶一个名为GetEnumerator()的方法,它有IEnumerator接口了类型来定制。通常,这个方法的实现只是交给保存子对象的内部成员,然而,我们也可以使用yield return 语法来提供多个
“命名迭代器”方法。
ICloneable
可克隆对象接口
IComparable
可比较对象接口
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号