1. 概述

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

2. 主要内容

  2.1 设计和实现接口

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

interface IExample
{
string GetResult();
int Value { get; set; }
event EventHandler ResultRetrived;
int this[string index] { get; set; }
} class ExampleImplementation : IExample
{
//只能都是public实现
public string GetResult()
{
return "result";
} public int Value { get; set; } public event EventHandler CalculationPerformed; public event EventHandler ResultRetrived; public int this[string index]
{
get { return ; }
set {}
}
}

  2.2 创建和使用基类

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

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

    ③ 抽象类和密封类

abstract class Base
{
public virtual void MethodWithImplementation() {//...}
public abstract void AbstractMethod();
} class Derived : Base
{
public override void AbstractMethod() {//...}
}

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

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

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

class Order : IComparable
{
public DateTime Created { get; set; } public int ComparaTo(object obj)
{
if (obj == null) return ; Order o = obj as Order; if (o == null)
throw new ArgumentException("Object is not a Order."); return this.Created.ComparaTo(o.Created);
}
} List<Order> orders = new List<Order>
{
new Order { Created = new DateTime(, , ); }
new Order { Created = new DateTime(, , ); }
new Order { Created = new DateTime(, , ); }
}; orders.Sort();

    ② IEnumerable

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

class Person
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
} public string FirstName { get; set; }
public string LastName { get; set; } public override string ToString()
{
return FirstName + " " + LastName;
}
} class People : IEnumerable<Person>
{
public People(Person[] people)
{
this.people = people;
} Person[] people; public IEnumerator<Person> GetEnumerator()
{
for (int index = ; index < people.Length; index++)
{
yield return people[index];
}
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

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

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

    ④ IUnknown

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

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

3. 总结

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

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

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

  ④ 密封类不能被继承。

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

最新文章

  1. WCF入门教程(三)定义服务协定--属性标签
  2. OpenGL的glTranslatef平移变换函数详解
  3. POJ 2004 Mix and Build (预处理+dfs)
  4. JQUERY与JS的区别
  5. Castle 开发系列文章
  6. js ajax上传图片到服务器
  7. Clean Code&ndash;Chapter 7 Error Handling
  8. jQuery 幻灯片 ----摘录
  9. PHP第二课笔记
  10. HOJ1014
  11. java项目打jar包的两种情况
  12. POJ1850-Code 递推数学
  13. Github站点英文翻译
  14. Centos6.5-dnsmasq安装
  15. java开发学生信息管理系统的实现(简洁易懂),适合计算机专业学生参考,课程设计、毕业论文设计参考等
  16. /etc/passwd- 和/etc/shadow-文件
  17. Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法
  18. TCP三次握手连接
  19. struts2 OGNL(Object-Graph Navigation Language) 井号,星号,百分号
  20. L236

热门文章

  1. 无法加载程序集,因为该程序集包含EdmSchemaAttribute,并按名称加载结束类型。不允许同时按名称和特性进行加载
  2. python 字典实现类似c的switch case
  3. transform的使用
  4. Iptables 防火墙开放常见的22,53,80端口
  5. Android开发-API指南-&lt;application&gt;
  6. AD转换精度的计算
  7. 在使用 百度编辑器 Ueditor 时,不能进入 Controller 相应的 Action 的处理方法
  8. 洛谷P2723 丑数 Humble Numbers
  9. 二模10day1解题报告
  10. Linux下搭建Lotus Domino集群