第十三章 接口

1. 概述

  本章将讨论如何定义和使用一个接口,还要提供一些指导原则,帮助你判断何时应该使用接口而不是基类。

2. 名词解释

3. 主要内容

  3.1 类和接口继承

    ① 在CLR中,任何类都肯定是从一个类(而且只能是一个从Object派生的类)派生的。

      ②CLR还允许开发人员定义接口,它实际只是对一组方法签名进行了统一命名。

  3.2 定义接口

    对CLR而言,接口定义就像是一个类型定义。CLR会为接口类型对象定义一个内部数据结构,同时可用反射机制来查询接口类型的功能。

  3.3 继承接口

    如果实现一个接口方法时没有显示标记为virtual,编译器会将它们标记virtual和sealed。

  3.4 关于调用接口方法的更多探讨

    System.String类型实现了以下几个接口:IComparable, ICloneable, IConvertible, IEnumerable, IComparable<String>, 

    IEnumerable<Char>, IEquatable<String>.

  3.5 隐式和显式接口方法实现(幕后发生的事情)

    在C#中,将定义方法的那个接口的名称作为方法名的前缀,创建的就是一个 显式接口方法实现(Explicit Interface Method Implementation,     EIMI)。

    EIMI不能指定可访问性(默认private),不能标记为virtual。

  3.6 泛型接口

    ① 编译时类型安全性。

    ② 处理值类型时,大量减少的装箱次数。

    ③ 类可以实现同一个接口若干次,只要每次使用不同的类型参数。

  3.7 泛型和接口约束

    泛型类型参数约束为接口的好处:

    ① 可将一个泛型类型参数约束为多个接口。

    ② 传递值类型的实例时可减少装箱操作。

  3.8 实现多个具有相同方法名和签名的接口

    必须用 显式接口方法实现。

  3.9 用显式接口方法实现来增强编译时类型安全性

    对于没有泛型版本的接口,可以用 显式接口方法实现 来增强类型安全性和减少装箱。

internal struct SomeValueType : IComparable
{
    private Int32 m_x;
    public SomeValueType(Int32 x) { m_x = x; }

    public Int32 CompareTo(SomeValueType other)
        return (m_x - other.m_x);

    Int32 IComparable.CompareTo(Object other)
        return CompareTo((SomeValueType) other);
}

  3.10 谨慎使用显式接口方法实现(EIMI)

    ① 没有文档解释一个类型具体如何实现一个EIMI,也没有智能感知支持。

    ② 值类型的实例在转型为接口时装箱。

    ③ EIMI不能由派生类型调用。

  3.11 设计:基类还是接口

    ① IS-A vs CAN-DO 关系。

    ② 易于使用。(使用基类要易于使用接口)

    ③ 一致性的实现。(无法保证任何人都能百分之百正确的实现一个接口)

    ④ 版本控制。(向接口添加一个成员,会强迫接口的继承者更改源码)

4. 总结

原文地址:https://www.cnblogs.com/stone_lv/p/4325923.html