《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第7章 类和继承 笔记
object
object是唯一的非派生类(derived class)。除了object,所有的类都是派生类。
类声明时,不显式派生自object,那么它隐式派生自object。
隐藏
派生类无法删除从基类(base class)继承的成员,但可以隐藏它。
- 声明相同名称的成员,可以隐藏字段、常量、属性。
- 声明相同签名的成员,可以隐藏方法。签名不包含返回值类型。
隐藏可以显式使用new关键字,也可以不使用。
使用基类访问(base access)可以访问被隐藏的成员:base关键字+点+成员名称。
使用基类的引用访问派生类,也可以访问隐藏的成员。
覆写
在基类中使用virtual声明一个函数成员,在派生类中使用override声明相同签名、相同返回值类型、相同可访问性的函数成员,则基类的被覆写,无法再被访问。无论使用基类访问还是基类引用访问,访问的都是派生类的函数成员。
无法覆写静态成员。
支持覆写的函数成员类型有方法、属性、索引器、事件。
使用override声明的函数成员支持被覆写,调用时访问最高派生(most-derived)版本。
实例化顺序
派生类对象实例化时,先初始化派生类的实例成员,再调用基类的实例构造函数,最后调用派生类的实例构造函数。
因此,在实例构造函数中调用virtual函数成员是极不推荐的,因为当被覆写时,它调用派生类对应的函数成员,而这时派生类的实例构造函数还没有被调用。
构造函数初始化语句
构造函数初始化语句有两种形式:
base形式允许派生类的实例构造函数,指定在它之前调用的基类实例构造函数。如果一个实例构造函数不带base形式的构造函数初始化语句,那么在它之前调用的基类无参实例构造函数,以下两种形式是等价的:
this形式允许在一个实例构造函数调用之前,调用另一个实例构造函数。
访问修饰符
类的访问修饰符只有两个级别:
- public:允许所有程序集访问。
- internal:只允许所属的程序集访问。
- 当类的访问修饰符缺省时,隐式声明为internal。
成员的访问修饰符有5个级别:public、private、protected、internal、protected internal。
当成员访问修饰符缺省时,隐式声明为private。
成员不能比它所属的类或结构有更高的可访问性,可访问性级别如图:
abstract
abstract声明的函数成员是抽象的,抽象成员只能在抽象类中声明。
抽象成员与虚成员的对比:
abstract声明的类是抽象类,抽象类不能实例化,只能作为基类。
抽象类的派生类可以是抽象类。
抽象类可以声明非抽象成员。
密封类
sealed声明的类是密封类,与抽象类相反,密封类不能作为基类。
静态类
static声明的类是静态类。
- 静态类的成员必须是静态的。
- 静态类是隐式sealed的,不能被继承。
扩展方法
扩展方法允许在类或结构外声明一个方法,调用时看起来像这个类或结构的成员。
命名约定
微软官方推荐将Camel大小写作为私有和受保护字段的名称。但作者认为前辍下划线更实用,并且微软在代码中也大量使用。