第10章多态 ■10.1多态的基础 1011虚成员 类中用关键字 virtual修饰的成员称为虚成员,虚成员有虚方法 虚属性和虚索引器。 在类的继承中,派生类获得了基类中的除了构造函数和析构函数 以外的所有成员,派生类不能删除这些成员。对于数据成员,派 生类可以隐藏基类的同名成员或者直接访问非 private成员;对 于行为成员,例如方法、属性、索引器等,也一样可以隐藏基类 的同名成员或者直接调用非 private成员 虚成员和抽象成员是完全不一样的,抽象成员,例如抽象方法, 是不完整的,不能执行的;而虚成员,例如虚方法,是完整的方 法,是可以执行的。仅仅就虚成员所在的类而言,有没有 virtual 修饰词不影响其功能
第10章 多态 10.1.1 虚成员 类中用关键字virtual修饰的成员称为虚成员,虚成员有虚方法、 虚属性和虚索引器。 在类的继承中,派生类获得了基类中的除了构造函数和析构函数 以外的所有成员,派生类不能删除这些成员。对于数据成员,派 生类可以隐藏基类的同名成员或者直接访问非private成员;对 于行为成员,例如方法、属性、索引器等,也一样可以隐藏基类 的同名成员或者直接调用非private成员。 虚成员和抽象成员是完全不一样的,抽象成员,例如抽象方法, 是不完整的,不能执行的;而虚成员,例如虚方法,是完整的方 法,是可以执行的。仅仅就虚成员所在的类而言,有没有virtual 修饰词不影响其功能。 ◼ 10.1 多态的基础
10.1多态的基础 ■10.12重写(覆盖) 重写又称为覆盖。对于基类的 virtua成员,在派生类中 重新加以定义称为重写或者覆盖。虚成员和虚成员的重写提供了 个能产生多态的功能。重写需要使用关键字 override,重写 和隐藏有相似的方面,但有有实质的区别。 如果重写基类的 virtua1成员,派生类的同名成员没有用 override,就等价于使用了缺省的new关键字,这样就产生了 个新的成员,并且隐藏了而不是重写了基类的同名的虚成员,这 样的程序仍然能够编译和运行,但编译时系统会提出警告
10.1 多态的基础 重写又称为覆盖。对于基类的virtual成员,在派生类中 重新加以定义称为重写或者覆盖。虚成员和虚成员的重写提供了 一个能产生多态的功能。重写需要使用关键字override,重写 和隐藏有相似的方面,但有有实质的区别。 如 果重 写基 类的 virtual成 员, 派生 类的 同名 成员 没有 用 override,就等价于使用了缺省的new关键字,这样就产生了一 个新的成员,并且隐藏了而不是重写了基类的同名的虚成员,这 样的程序仍然能够编译和运行,但编译时系统会提出警告。 ◼ 10.1.2 重写(覆盖)
101.3多态对象 用基类类名声明但是用派生类构造函数创建,这类对象的主要 用途是引发多态,为了将它们和一般的对象(声明和创建都使 用同一个类型名的对象)加以区别、揭示它们的特点和用途, 本书将这种形态的对象称为多态对象
10.1.3 多态对象 用基类类名声明但是用派生类构造函数创建,这类对象的主要 用途是引发多态,为了将它们和一般的对象(声明和创建都使 用同一个类型名的对象)加以区别、揭示它们的特点和用途, 本书将这种形态的对象称为多态对象
10.14隐藏和重写的比较 隐藏和重写是基类和派生类的同名成员的两种不同关系,隐 藏可以发生在数据成员和行为成员上,而重写只是对行为成 员而言的;一组同名成员只能体现出一种关系,所以在一般 情况下是不会产生混淆的。但是,在存在虚成员、重写和多 态对象的情况下,分清隐藏和重写两种调用同名方法时机制 的差别是有必要的 10.1.5上溯 把派生类的对象当作基类的对象来处理,称为上溯。检 查上溯是否成立的过程是从基类出发检查派生类中是否重写 了基类的同名虚方法,一直到创建多态对象的派生类类型
10.1.4 隐藏和重写的比较 隐藏和重写是基类和派生类的同名成员的两种不同关系,隐 藏可以发生在数据成员和行为成员上,而重写只是对行为成 员而言的;一组同名成员只能体现出一种关系,所以在一般 情况下是不会产生混淆的。但是,在存在虚成员、重写和多 态对象的情况下,分清隐藏和重写两种调用同名方法时机制 的差别是有必要的。 10.1.5 上溯 把派生类的对象当作基类的对象来处理,称为上溯。检 查上溯是否成立的过程是从基类出发检查派生类中是否重写 了基类的同名虚方法,一直到创建多态对象的派生类类型
10.16编译时的多态和运行时的 多态 如果在编译时就能确定调用什么对象中的成员,称为编译时的 多态,也称为早期绑定,只有当运行时才能确定调用哪个对象 中的成员的情形,称为运行时多态,又称为晚期绑定。 隐藏、重载都属于早期绑定,即编译时的多态;虚方法、重写 和多态对象能引发的是晚期绑定,即运行时的多态
10.1.6 编译时的多态和运行时的 多态 如果在编译时就能确定调用什么对象中的成员,称为编译时的 多态,也称为早期绑定,只有当运行时才能确定调用哪个对象 中的成员的情形,称为运行时多态,又称为晚期绑定。 隐藏、重载都属于早期绑定,即编译时的多态;虚方法、重写 和多态对象能引发的是晚期绑定,即运行时的多态
10.2多态技术的应用和流程共享 多态技术有很多应用,例如对基类方法的改进和扩展,更重要的是, 多态技术能够提供一种机制,把相同基类的所有派生类对象作为一个 集合进行处理
10.2 多态技术的应用和流程共享 多态技术有很多应用,例如对基类方法的改进和扩展,更重要的是, 多态技术能够提供一种机制,把相同基类的所有派生类对象作为一个 集合进行处理
103 ToString()的重写 ToString0方法用来返回对象的字符串表示,对于类型,例如内 置的类型,系统已经重写了 ToString方法。原则上, ToString方 法可以返回各种信息,但因为 ToString方法是很常用的方法,所 以总是希望该方法能够返回最重要的信息。 如果 ToString方法没有被重写,那么它返回该对象所属的类名, 所以在自定义一个类时,重写 ToString方法是很有实用价值的, 可以通过重写 ToString方法返回能够表示该对象有别于其它对象 的有意义的字符串形式的信息。 在实际操作中,象 Console. WriteLine0等方法,如果带一个对 象做参数,则自动调用对象的 ToString0方法;在字符串与其他 对象用加号运算符进行连接时,也会自动调用 ToString0方法
10.3 ToString( )的重写 ToString()方法用来返回对象的字符串表示,对于类型,例如内 置的类型,系统已经重写了ToString方法。原则上,ToString方 法可以返回各种信息,但因为ToString方法是很常用的方法,所 以总是希望该方法能够返回最重要的信息 。 如果ToString方法没有被重写,那么它返回该对象所属的类名, 所以在自定义一个类时,重写ToString方法是很有实用价值的, 可以通过重写ToString方法返回能够表示该对象有别于其它对象 的有意义的字符串形式的信息。 在实际操作中,象Console.WriteLine()等方法,如果带一个对 象做参数,则自动调用对象的ToString()方法;在字符串与其他 对象用加号运算符进行连接时,也会自动调用ToString()方法