第4章继承和多态简介为了提高软件模块的可复用性和可扩张性,以便提高软件的开发效率,我们总是希望能够利用前人或自己的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块。今天,任何面向对象的程序设计语言都必须提供两个重要的特性:继承性(inheritance)和多态性(polymorphism)。目录4.1类的继承4.2重写和多态性4.3抽象类和抽象方法4.4密封类和密封方法4.5静态类和静态方法4.1类的继承-派生类的声明格式继承是OOP(ObjectOrientedPrograming)的一个重要特征,它允许在已有类的基础上创建新类,新类不但从既有类中继承类成员,而且可以重新定义或加进新成员。被继承(也称为被派生)的类为基类或父类,继承后产生的类为派生类或子类。注意,C#中的派生类只能直接继承于一个基类,当然基类也可以有自己的基类。类的继承与派生保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类。继承与派生的目的继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。派生的过程:吸收已有类成员;调整已有类成员;添加新的类成员。派生类的声明格式派生类的声明格式如下:类修饰符class类名:基类{类体}派生类的注意事项派生类的注意事项只允许单继承,即派生类只能有一个基类继承可传递,即,A派生出B,B又可派生出C派生类可扩展它的直接基类,但不能删除从基类继承的成员构造函数和析构函数不能被继承派生类可以隐藏(new)基类的成员:如果在派生类中声明了与基类同名的新成员时,则该基类的成员在派生类中就不能被访问(但可以用base访问)派生类的声明格式【例4-1】现有一个Animal类,由Animal类派生一个Dog类。由于Dog除了具有自身的特有性质,还有Animal的所特有性质,所以可用继承的方法来重用Animal类。代码如下,该代码位于Chap4-1中。请参考书本实例介绍注意:派生类不能访问基类中的私有成员,但可以访问其公共成员。若允许一个成员可由基类和派生类访问,但不能由外部的代码访问,则可使用protected修饰符将其声明为保护成员。继承过程中修饰符变化(1)基类中的public成员:(类内可见,类外可见)在派生类中变为:public(派生类内可见,派生类外可见)(2)基类中的private成员:(基类内可见,基类外不可见)在派生类中变为:unaccessble(派生类内不可见,派生类外不可见)(3)基类中的protected成员:(类内可见,类外不可见)在派生类内变为:protected(派生类中可见,派生类外不可见)隐藏基类方法当派生类从基类继承时会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,有两种选择:一是在派生类中使用new关键字隐藏基类中的同名成员。二是重写虚拟的基类成员。(基类:virtual;派生类:override)同名方法的调用基类内:调用基类同名方法基类外(基类对象):调用基类同名方法派生类内:调用派生类同名方法,通过base调用基类同名方法。派生类外(派生类对象):调用派生类同名方法。base关键字在C#中可以使用base关键字从派生类中访问基类的成员。使用base的一种情形是调用基类上已被其他方法重写的方法;另一种情形是指定创建派生类示例时应调用的基类构造函数。派生类构造函数满足构造函数的基本特征派生类构造函数构造原则:(1)基类中的字段交给基类构造函数(2)初始化新添加字段。格式:public派生类名(总参列表):base(参数列表){新成员初始化}重写与隐藏的区别语法区别:隐藏:基类方法不做申明,在派生类中使用new声明。重写:基类方法声明为virtual(虚方法),派生类中使用override申明重写。调用区别调用区别C#隐藏时,通过父类变量调用子类对象则使用父类的方法,通过子类变量调用子类对象则使用子类方法。C#重写时,通过父类、子类变量调用子类对象皆使用子类的重写方法;隐藏与重写的调用规则===BbAaAanewB();b...