《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第15章 接口 笔记

BCL声明了名为IComparable的接口:

public interface IComparable
{
    int CompareTo(object obj);
}
  • 当this小于obj时返回负值,当this等于obj时返回0,当this大于obj时返回正值。

Array.Sort()依赖IComparable接口进行排序,如果元素类型没有实现IComparable接口,将抛出异常。

接口不能包含数据成员和静态成员。
接口可以包含非静态的方法、属性、事件、索引器。
接口的函数成员声明的函数体必须为分号。
接口的命名惯例是以大写I起始。
接口支持分部接口声明。
接口支持所有访问修饰符,但它的成员不支持访问修饰符,它的成员是隐式public的。

只有类和结构能实现接口。
实现接口必须实现它的所有成员。
当一个类从基类继承并实现了接口,在它的声明中,基类必须写在最左边。

class Derived: MyBaseClass, IIfc1, IEnumerable, IComparable
{
    ...
}

接口是引用类型。

使用as运算符,将类对象转换为一个接口对象。

  1. 如果类实现了这个接口,返回接口引用。
  2. 如果类没有实现这个接口,返回null,不抛出异常。

当一个类实现的两个接口,有完全相同的成员,即签名与返回值类型都相同。那么两个接口可以共享同一个实现:

interface IIfc1
{
    void PrintOut(sring s);
}
interface IIfc2
{
    void PrintOut(sring s);
}
class MyClass : IIfc1, IIfc2
{
    public void PrintOunt(sring s) // 两个接口的单一实现
    {
        Console.WriteLine("Calling through: {0}", s);
    }
}

实现接口的类可以从它的父类继承实现代码:

interface IIfc1
{
    void PrintOut(sring s);
}
class MyBaseClass
{
    public void PrintOunt(sring s)
    {
        Console.WriteLine("Calling through: {0}", s);
    }
}
class Derived : MyBaseClass, IIfc1
{
}

当一个类实现多个接口时,显式接口成员实现支持每个接口的成员都有各自的实现,即使它们的成员完全相同(签名和返回值类型)。

class MyClass : IIfc1, IIfc2
{
    void IIfc1.PrintOut (sring s)
    { ... }
    void IIfc2..PrintOut (sring s)
    { ... }
}

显式接口成员实现,只能通过接口引用访问。

接口支持继承接口。