1. 概述

  本章包括 设计和实现接口、创建和使用基类 以及 使用.net类库提供的标准接口。

2. 主要内容

  2.1 设计和实现接口

    一个接口包含公共的方法、属性、事件、索引器。类和结构都可以实现接口。

  1. interface IExample
  2. {
  3. string GetResult();
  4. int Value { get; set; }
  5. event EventHandler ResultRetrived;
  6. int this[string index] { get; set; }
  7. }
  8.  
  9. class ExampleImplementation : IExample
  10. {
    //只能都是public实现
  11. public string GetResult()
  12. {
  13. return "result";
  14. }
  15.  
  16. public int Value { get; set; }
  17.  
  18. public event EventHandler CalculationPerformed;
  19.  
  20. public event EventHandler ResultRetrived;
  21.  
  22. public int this[string index]
  23. {
  24. get { return ; }
  25. set {}
  26. }
  27. }

  2.2 创建和使用基类

    ① 使用 virtual 和 override 关键字,可以在子类中重写父类的方法。

    ② 如果父类的方法没有标记为virtual,子类中可以用 new 关键字显示隐藏父类的方法。new方法只能被子类对象自己调用。

    ③ 抽象类和密封类

  1. abstract class Base
  2. {
  3. public virtual void MethodWithImplementation() {//...}
  4. public abstract void AbstractMethod();
  5. }
  6.  
  7. class Derived : Base
  8. {
  9. public override void AbstractMethod() {//...}
  10. }

      与抽象类对应的是密封类,密封类不能被继承,所有成员必须提供实现。结构体(struct)就是一种隐式的密封类。

  2.3 使用.net类库提供的标准接口

    ① IComparable: 只有一个方法( int ComparaTo(object obj) ). 用于提供排序支持。有泛型版本。

  1. class Order : IComparable
  2. {
  3. public DateTime Created { get; set; }
  4.  
  5. public int ComparaTo(object obj)
  6. {
  7. if (obj == null) return ;
  8.  
  9. Order o = obj as Order;
  10.  
  11. if (o == null)
  12. throw new ArgumentException("Object is not a Order.");
  13.  
  14. return this.Created.ComparaTo(o.Created);
  15. }
  16. }
  17.  
  18. List<Order> orders = new List<Order>
  19. {
  20. new Order { Created = new DateTime(, , ); }
  21. new Order { Created = new DateTime(, , ); }
  22. new Order { Created = new DateTime(, , ); }
  23. };
  24.  
  25. orders.Sort();

    ② IEnumerable

      IEnumerable 和 IEnumerator 接口用于实现遍历模式。

  1. class Person
  2. {
  3. public Person(string firstName, string lastName)
  4. {
  5. FirstName = firstName;
  6. LastName = lastName;
  7. }
  8.  
  9. public string FirstName { get; set; }
  10. public string LastName { get; set; }
  11.  
  12. public override string ToString()
  13. {
  14. return FirstName + " " + LastName;
  15. }
  16. }
  17.  
  18. class People : IEnumerable<Person>
  19. {
  20. public People(Person[] people)
  21. {
  22. this.people = people;
  23. }
  24.  
  25. Person[] people;
  26.  
  27. public IEnumerator<Person> GetEnumerator()
  28. {
  29. for (int index = ; index < people.Length; index++)
  30. {
  31. yield return people[index];
  32. }
  33. }
  34.  
  35. IEnumerator IEnumerable.GetEnumerator()
  36. {
  37. return GetEnumerator();
  38. }
  39. }

    *yield关键字只能用于迭代块(iterators)中,编译器会将这段代码转化成状态机,并生成相应的集合遍历代码。

    ③ IDisposable: 用于跟外部资源或非托管代码更好的协同工作。只有一个Dispose方法,用于释放非托管的资源。

    ④ IUnknown

      一般情况下,只需添加COM对象引用,编译器就会生成相应的交互类。

     如果由于某些原因无法生成,就需要自己写交互类。这个时候就会用到IUnknown接口。

3. 总结

  ① 接口声明了一些必须被实现的公共成员。

  ② 基类可以将方法标记为virtual,这样子类就可以重写这些方法,增加或者修改具体实现。

  ③ 抽象类不能被实例化,只能当做基类使用。

  ④ 密封类不能被继承。

  ⑤ .net类库提供了一些默认接口供使用:IComparable, IEnumerable, IDisposable, IUnknown.

第九章 管理类型(In .net4.5) 之 继承机制的更多相关文章

  1. 第十一章 管理类型(In .net4.5) 之 管理对象的生命周期

    1. 概述 本章内容包括 管理非托管资源.使用IDisposable接口 以及 管理析构器和垃圾回收. 2. 主要内容 2.1 理解垃圾回收机制 ① 代码执行的时候,内存中有两个地方存放数据项:堆 和 ...

  2. 第十二章 管理类型(In .net4.5) 之 操作字符串

    1. 概述 本章包括 字符串基本操作 以及 查找.遍历.格式化字符串. 2. 主要内容 2.1 在.net平台中使用字符串 C#中,string是用来保存文本信息的.是一个被当做值类型使用的引用类型. ...

  3. 第七章 管理类型(In .net4.5) 之 使用类型

    1. 概述 本章介绍 值类型的装箱拆箱.类型转换 以及 C#4.0新推出的 dynamic 关键字. 2. 主要内容 2.1 装箱和拆箱 2.2 类型转换 有四种方式可以实现类型转换: ① 隐式转换: ...

  4. 第六章 管理类型(In .net4.5) 之 创建类型

    1. 概述 本章内容包括 C#5中如何更好的创建类型以及如何扩展现有类型. 2. 主要内容 2.1 如何选择类型 C#类型系统包括三种类型:值类型.引用类型.指针类型.(指针类型用于非托管代码,很少使 ...

  5. 第十章 管理类型(In .net4.5) 之 使用反射

    1. 概述 一个.net程序不仅包含代码和数据,还包含 元数据. 本章介绍如何应用attributes以及如何使用反射来获取它,还有如何使用CodeDom和expression trees来实现在运行 ...

  6. 第八章 管理类型(In .net4.5) 之 加强封装

    1. 概述 本章内容包括 访问控制符.属性 和 显式接口实现. 2. 主要内容 2.1 访问控制符 封装的核心是隐藏信息.访问控制符用来实现类型成员的访问控制. C#的访问控制符有:public, i ...

  7. LinuxShell脚本攻略--第九章 管理重任

    收集进程信息 $ ps PID TTY TIME CMD pts/ :: bash pts/ :: ps$ ps -f  #-f 显示更详细的信息UID PID PPID C STIME TTY TI ...

  8. kubernetes第九章--管理机密信息

  9. 20190819 On Java8 第九章 多态

    第九章 多态 向上转型回溯 可扩展性 由于多态机制,在一个设计良好的面向对象程序中,许多方法,只与基类接口通信.这样的程序是可扩展的,因为可以从通用的基类派生出新的数据类型,从而添加新的功能.那些操纵 ...

随机推荐

  1. python 实例属性之单,双下划线

    具体区别看下面例子 class A: def __init__(self,name='Andy'): self._name = name class B: def __init__(self,name ...

  2. Bootstrap 3 How-To #1 下载与配置

    Bootstrap 3 发布了,通过简单的几步,我们就可以使用 Bootstrap 的样式表,图标,以及 javascript 来配置一个简单的站点. 准备 Bootstrap 不仅仅是一个代码集,还 ...

  3. POJ3264RMQ

    http://poj.org/problem?id=3264 #include<stdio.h> #include<string.h> #include<algorith ...

  4. (旧)子数涵数·PS——替换颜色

    一,老规矩,下载素材(老样子,还是美美的少女) 二.打开PS,并打开素材. 三.复制一个图层,快捷键Ctrl+J(好习惯) 四.使用"替换颜色"命令,弹出对话框. 五.选择人物衣服 ...

  5. 基于Web的企业网和互联网的信息和应用( 1194.22 )

    基于Web的企业网和互联网的信息和应用( 1194.22 ) 原文更新日期: 2001年6月21日原文地址: http://www.access-board.gov/sec508/guide/1194 ...

  6. 关于static/const的作用

    这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区). 2) 在模块内 ...

  7. APUE第4章 文件和目录

    4.2 文件函数 #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict b ...

  8. import的用法

    转自python学习笔记--模块和命名空间 模块(module)是Python中非常重要的一个概念,模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的 ...

  9. 第四次java实验报告

    20145306 实验四 java 开发基础 设计过程: 1.创建项目 2.选择activity_main.xml 3.显示自己的学号 4.双击改变字体大小 5.预览

  10. hibernate 问题

    如果hibernate中反转的表中没有主键的话,会生产三个文件. table.java tableADO.java tableId.java 并且在执行findByProperty时,会提示:coul ...