24.3.24 《CLR via C#》 笔记10

第十三章 接口

  1. 类和接口继承
    1. CLR不支持多继承,因此所有托管编程语言都不支持
    2. 任何类都从且只能从一个类派生(最终从Object类派生)
    3. 定义接口实际只是对一组方法进行了统一的命名,类通过指定接口名称来继承接口,且必须显式实现接口方法
  2. 接口可以定义方法、事件、无参属性和有参属性(索引器);不能定义构造器方法、实例字段
  3. C#中使用interface关键字定义接口;根据约定,接口类型名称以I开头
  4. 接口可以从另一个或多个接口”继承“,例:IC继承IA和IB,则继承IC的类也要实现IA和IB中定义的方法,该类也视为实现了IA和IB
  5. 派生类不能重写基类的接口方法(因为接口方法被CLR标记为sealed),但是派生类可以重新继承同一个接口,调用接口方法时会调用在该类上的实现
  6. CLR允许定义接口类型的字段、参数和局部变量,接口类型的变量可以调用接口中定义的方法;值类型也可以实现零个或多个接口,但是值类型的实例转换为接口类型时必须装箱
  7. 隐式和显式接口方法实现
    1. 隐式实现:在类中定义一个和接口方法有相同参数和返回类型的方法,编译器自动认为该方法匹配接口方法,两个记录项(使用类的对象调用方法、使用接口类型的对象调用方法)将引用同一个实现
    2. 显式接口方法实现(EIMI):在类中用接口的名称作为方法名前缀定义一个方法,然后直接定义一个相同签名的方法,将被视为两个方法。
    3. 例:类MyClass继承接口IDisposable
      1. 隐式实现:public void Dispose() {}
      2. 显式实现:public void Dispose() {} void IDisposable.Dispose() {}
      3. myClass.Dispose() 和 ((IDisposable)myClass).Dispose()是有区别的
  8. 泛型接口
    1. 泛型接口提供了编译时的类型安全性(使用Object作为参数可能造成运行时抛出参数类型异常)
    2. 使用泛型接口将减少装箱(使用Object时,传递值类型需要装箱)
    3. 类可以多次实现同一个泛型接口(每次实现使用不同的类型参数)
    4. 可以将类型参数标记为协变和逆变(in、out)
  9. 泛型和接口约束
    1. 可以将泛型类型参数约束为多个接口(传递的参数类型必须实现接口)
    2. 在值类型上调用接口可以不装箱
  10. 实现多个具有相同方法名和签名的接口(两个接口中定义了相同名称和签名的方法):使用EIMI
  11. 用EIMI增强编译时的类型安全性:例定义CompareTo(Object other)时用EIMI定义(IComparable.CompareTo(Object other)),然后在类中再定义一个CompareTo(MyClass other),获得编译时安全性和减少装箱
  12. 尽量避免使用EIMI
  13. 应该设计类型还是接口
    1. 类型意味着IS-A关系,接口意味着CAN-DO关系
    2. 从基类派生更简单,因为继承接口的类必须实现所有成员,而派生类型可能只需稍作改动
    3. 接口无法保证所有人百分百正确实现它,而基类可以默认提供一个良好的实现
    4. 向基类添加新方法,派生类型将自动继承;向接口添加新方法,所有继承者都要添加(现在好像接口也可以提供默认实现了)
    5. 两件事情可以同时做:定义接口,然后定义实现该接口的基类

相关推荐

  1. pandas学习笔记10

    2024-03-24 13:44:01       13 阅读
  2. yolov10 学习笔记

    2024-03-24 13:44:01       7 阅读
  3. 开发实践10_PurchaseOrder笔记

    2024-03-24 13:44:01       25 阅读
  4. mysql笔记10. 日志

    2024-03-24 13:44:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 13:44:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 13:44:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 13:44:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 13:44:01       18 阅读

热门阅读

  1. 优化 - 数据结构

    2024-03-24 13:44:01       18 阅读
  2. 100268. 最长公共后缀查询(字典树查询)

    2024-03-24 13:44:01       17 阅读
  3. 重新了解一下之前的單對象變化問題

    2024-03-24 13:44:01       16 阅读
  4. Bom,事件对象

    2024-03-24 13:44:01       18 阅读
  5. extern c 和extern c++

    2024-03-24 13:44:01       17 阅读
  6. cookie、session和token的区别

    2024-03-24 13:44:01       22 阅读
  7. 读《舞!舞!舞!》有感

    2024-03-24 13:44:01       19 阅读
  8. SpringBoot全局异常处理方法

    2024-03-24 13:44:01       19 阅读
  9. 【Node.js】events

    2024-03-24 13:44:01       21 阅读