所有类都派生自object类,单继承。
派生类不能删除它所继承的任何成员。
派生类中声明新的带有相同签名的函数成员,可以隐藏或者掩盖继承的函数成员。(签名由名称和参数列表,不含返回类型)
new关键字显式告知编译器掩盖基类成员(包括静态成员),否则编译器会警告你隐藏了一个继承的成员。可使用base.XXX访问隐藏的成员。
虚方法可以使基类的访问“升至”派生类内。
条件: 派生类的方法 和 基类方法有相同的签名和返回类型。 基类方法用virtual标注,派生类使用override标注。
构造顺序: 实例创建时,先初始化对象的所有实例成员,其次是基类构造函数,最后是自身构造函数体。
public 对任何类可访问。
protected internal: 对所有继承该类或在该程序集内声明的类可访问。
protected :对所有继承该类的类可访问。
internal: 对该程序集内所有类可访问。
private: 只有类的内部可访问。
从上到下,公开到似有,其中 protected 与 internal平行。
抽象成员:abstract修饰,无实现代码块,必须在派生类中用相应的成员覆写(override). 注意virtual有实现体不一定要覆写。
抽象类abstract 设计就是要被继承的,只能作为其他类的基类,可以包含抽象成员或非抽象成员。
密封方法与抽象成员相反,只能作为独立的类,不能做基类。
静态类:所有成员都是静态 static class,隐式密封,无实例构造函数,常用于数学库。
扩展方法:
假设要扩展一个类,增加方法。(不能访问代码,或该类是密封的,或者其他设计原因使这些方法不能使用,不得不在新类中使用旧类公用方法编写新方法)
你一般只能使用 ExtendHandler.NewFunc(OldClass) 而不是OldClass.NewFunc().
扩展方法允许使用第二种形式,只需要在参数声明中的类型前增加this关键字。
扩展方法: 声明扩展方法类必须是static,扩展方法本身是static,扩展方法必须包含关键字this作为第一个参数,并后面被扩展类的名称。