基类与派生类
• 一个新类可以从已有类中获其特性,这种现象称为类的继承。
换句话说,从已有类创建一个新的类,称为类的派生。 将已有类称为基类或父类,新建类称为派生类或子类。
• 一个派生类能够继承已有类中的几乎全部成员(构造函数和析 构函数除外)。
• 派生类中可根据需要增加新成员、并对继承的方法进行扩充和 修改。
• 派生类比基类更加具体,而基类则是派生类的抽象。
• 在C#中,借助“:”构建派生类
C#中派生类声明的一般格式:
其中,基类名必须是已有类的名称,默认的基类名为object(System.Object), 可省略。
派生类名是新创建的类类型的名字。
对继承的几点说明
• C#仅支持单继承。即一个类只能从一 个直接基类派生。
• 派生类可作为其它派生类的基类;派 生的多个相关联类将构成一个类层次。
• 类层次中的最高层是object类,它是 任何类的直接或间接基类。
• 继承具有传递性。如果类A派生出类B, 类B派生出类C,则类C会继承类B和 类A中声明的几乎所有成员。
派生类中成员的可访问性
• 派生类全面继承基类中的成员。
在派生类中不能直接访问基类的私有 (private )成员,但可通过继承自基类的公有(public)属性或公有方法对 其私有成员进行操作。
• 例如:在派生类Manager中同样包含了四个字段,除新增的special字段外,其 余三个字段name,salary和depart都是来自基类Employee。
通过执行基类 Employee的公有方法Register()和Base.Show() 对基类中的三个私有字段进行 操作。
注意:基类中的公有属性、公有方法被派生类继承后,仍然保持其 公有特性,且在派生类中可以直接访问。
new关键字与base关键字
new关键字
用于在派生类中以“覆盖”方式声明与基类中同名的新方法。这时,在派 生类中系统将“隐藏”基类中的同名方法。如果需要使用被隐藏的方法可以借 助base关键字。
base关键字:指代基类。
• 在派生类中用以访问被“覆盖”的基类成员方法。如base.方法名()是指访问 与派生类同名的基类方法。
• 派生类的构造方法调用直接基类构造方法时,也使用base指代基类名。
使用NEW“覆盖”的基类方法通常具有与基类方法名,参数个数,参数类型完全 相同的格式。
如果希望在派生类中能直接访问基类的私有成员,又不允许在类之外访问,可以将基 类中的私有(private)成员声明修改为保护成员(protected)。
保护成员
• 在C#中,类成员访问修饰符包括:private、public、internal和protected。 由protected修饰的成员称为保护成员。
• 保护成员不能在类外被类对象访问,这点与私有成员类似。但保护成员可以 被派生类的方法与属性引用,这一点与私有成员是不同的。
派生类可直接访问从基类继承的公有和保护成员。
但派生类方法覆 盖基类方法时,使用base.方法名()的形式可访问基类的方法。
注意:如果在类中声明了保护成员,就意味着该类可能要作为基 类,其派生类中要访问这些成员。
所有非私有基类成员在派生类中保持原访问修饰符(即基类的公 有和保护成员在派生类内中仍然是公有和保护的)。
派生类的构造函数
派生类构造函数的声明格式:
其中:base(参数表)为显式访问基类中带有参数的构造函数。
说明:对于基类的默认构造函数或不带参数的构造函数,系统在实例 化时会自动访问(隐式访问),在这种情况下,可以省略显式访问。
派生类的构造函数执行顺序
• 在C#中,创建派生类对象时,系统将按照对象的类层次从低到高 逐层调用执行其直接基类的构造函数,直到无直接基类的最高层 类(object类),这时最先执行object类的构造函数体,最后执行 最底层类的构造函数体。
• object类是所有类的根,它有一个默认的构造函数。
• 基类的构造函数是为其派生类对象继承的基类实例变量初始化。 使用base关键字调用基类的构造方法。
• 例如:实例化一个C类对象时,构造函数的执行过程:
先访问C的构造函数;在执行C类构造函数体之前,先访问B的 构造函数,…,先访问基类object的构造函数。
接下来,依次执行 object类的构造函数体、A类的构造函数体、…
最后执行C类的 构造函数体
object类
object(System.Object 的别名)类是所有类的直接或间接基类,因此,我们可以把任何 类型的值赋给object 类型的变量。
• 该类提供了7个公共接口,任何对象都可以使用。
1、Equals函数,该方法有重载函数
函数签名: public virtual bool Equals(Object obj) public static bool Equals(Object objA,Object objB)
• 作用:比较两个对象是否相等。相等时返回true,否则返回false。
• 默认情况下,对于引用类型,该方法对比的是引用的地址,对于值类型,比较的 是值的二进制描述是否相同。
2、GetType()函数 函数签名:public Type GetType()
作用:获取当前实例的确切运行时类型。
3、ToString()函数 函数签名:public virtual string ToString()
作用:返回一个代表当前对象的字符串 注意:默认情况下返回的是该对象所属类型的全名称。