《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第7章 类和继承 笔记

object

object是唯一的非派生类(derived class)。除了object,所有的类都是派生类。
类声明时,不显式派生自object,那么它隐式派生自object。

隐藏

派生类无法删除从基类(base class)继承的成员,但可以隐藏它。

  1. 声明相同名称的成员,可以隐藏字段、常量、属性。
  2. 声明相同签名的成员,可以隐藏方法。签名不包含返回值类型。

隐藏可以显式使用new关键字,也可以不使用。

使用基类访问(base access)可以访问被隐藏的成员:base关键字+点+成员名称。
使用基类的引用访问派生类,也可以访问隐藏的成员。

覆写

在基类中使用virtual声明一个函数成员,在派生类中使用override声明相同签名、相同返回值类型、相同可访问性的函数成员,则基类的被覆写,无法再被访问。无论使用基类访问还是基类引用访问,访问的都是派生类的函数成员。
无法覆写静态成员。
支持覆写的函数成员类型有方法、属性、索引器、事件。
使用override声明的函数成员支持被覆写,调用时访问最高派生(most-derived)版本。

实例化顺序

派生类对象实例化时,先初始化派生类的实例成员,再调用基类的实例构造函数,最后调用派生类的实例构造函数。
因此,在实例构造函数中调用virtual函数成员是极不推荐的,因为当被覆写时,它调用派生类对应的函数成员,而这时派生类的实例构造函数还没有被调用。

构造函数初始化语句

构造函数初始化语句有两种形式:


base形式允许派生类的实例构造函数,指定在它之前调用的基类实例构造函数。如果一个实例构造函数不带base形式的构造函数初始化语句,那么在它之前调用的基类无参实例构造函数,以下两种形式是等价的:

this形式允许在一个实例构造函数调用之前,调用另一个实例构造函数。

访问修饰符

类的访问修饰符只有两个级别:

  1. public:允许所有程序集访问。
  2. internal:只允许所属的程序集访问。
  • 当类的访问修饰符缺省时,隐式声明为internal。

成员的访问修饰符有5个级别:public、private、protected、internal、protected internal。

当成员访问修饰符缺省时,隐式声明为private。
成员不能比它所属的类或结构有更高的可访问性,可访问性级别如图:

abstract

abstract声明的函数成员是抽象的,抽象成员只能在抽象类中声明。
抽象成员与虚成员的对比:

abstract声明的类是抽象类,抽象类不能实例化,只能作为基类。
抽象类的派生类可以是抽象类。
抽象类可以声明非抽象成员。

密封类

sealed声明的类是密封类,与抽象类相反,密封类不能作为基类。

静态类

static声明的类是静态类。

  1. 静态类的成员必须是静态的。
  2. 静态类是隐式sealed的,不能被继承。

扩展方法

扩展方法允许在类或结构外声明一个方法,调用时看起来像这个类或结构的成员。

命名约定


微软官方推荐将Camel大小写作为私有和受保护字段的名称。但作者认为前辍下划线更实用,并且微软在代码中也大量使用。