接口类型

  接口就是一组抽象成员的命名集合。接口表示某各类或结构可以选择去实现的行为。接口成员总是抽象的(隐式公共的)。

  定义接口成员时,不需要为这个成员定义实现作用域。接口是纯粹的协议,因此也不会定义实现。

  判断类型是否引用接口可以用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

  可比较对象接口