这本书讲解 C# 语言十分详细,我将其中的重要内容 整理成条款,以备忘。
1. 接口是包含一组没有实现的成员的引用类型。实现一个接口:必须在基类列表后列出接口名称,并为接口的每一个 成员提供具体实现。接口中只能包含:方法、属性、事件、索引 (这四种成员在本质上都是方法)。
2. 接口名称从大写的 I 开始,接口也可以声明为分部的 ( partial ),接口声明可以有访问修饰符 ,而接口的成员是隐式为 public 的,不能有任何 访问修饰符 。只有类和结构才能实现接口。如果类从基类继承并实现接口,基类名称必须放在任何接口之前 。
3. 接口是引用 类型。可以通过把类对象的引用强制转换为接口类型来获取指向接口的引用,然后就可以用点运算符调用接口的方法了。通过相应类对象强制转换得到的接口引用调用接口方法时会根据所被转换的类对象 而选择此方法在该类中的相应 实现 。
4. 通常使用强制转换类对象为类未实现的接口的引用时,会抛出一个异常,使用 as 运算符可以避免此问题:如果类实现了接口,表达式返回指向接口的引用,若未实现接口,则返回 null 而非抛出异常。
5. 类或结构可以实现任意数量 的接口,所以有可能两个或多个接口都有相同的签名和返回类型 ,这种情况下,类可以实现单个 成员来满足所有包括重复成员 的接口 。如果类实现了多个接口,我们可以获取每一个接口的独立引用。
6. 实现接口的类可以从它的基类继承实现的代码 ,即如果一个类在基类列表中包含了接口,而它的基类中有对应接口的方法的实现,即使类主体为空,还是可以通过继承基类的方法来实现该接口。
7. 普通的隐式接口实现有一个缺点:它允许客户可以直接调用实现类中的方法,而不是通过接口调用类中的方法,这增加了代码的耦合性而且违反了面向接口编程的原则。显式接口实现可以禁止客户直接通过类对象调用被实现的方法 。
8. 显式接口成员的实现可以为每一个接口分离实现,通过使用接口名称和·分隔符构成。显式实现的接口即实现了该接口中方法的独立版本,而非类级别 的实现,所以调用时必须使用指向接口的引用 而不能通过类的实例 ,而且此类的派生类的成员也不能访问显式实现的接口成员,必须总是使用接口的引用来访问。另外,显式实现 接口的成员时,不需要任何修饰符 。类中的私有方法不能 作为接口方法的实现 。
9. 注意:如果有显示接口成员实现,类级别的实现也是允许的 ,但不是必须 的。显式实现满足了类或结构必须实现的方法。以下这三中实现都是允许的:
类级别的实现
显示接口成员实现
类级别实现和显示接口成员实现并存
10. 接口可以继承接口,即可以在基接口列表中有任意多个 ,最终得到的接口包含它声明的所有 基接口的成员 。