(一)类的继承与多态
1、继承
任何类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不继承多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类
(1)使用继承
继承的基本思想是基于某个基类的扩展,制定出一个新的派生类(子类),派生类可以继承基类原有的属性和方法,也可以增加原来基类所不具备的属性和方法,或者重写几类中的某些方法。
在C#中使用“:”来标识两个类的继承关系。在派生类不能继承基类中所定义的private成员,只能继承基类的public成员和protected成员。
(2)base关键字
base关键字用于从派生类中访问基类的成员,它主要有两种使用形式,分别如下。
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行,因此,从静态方法使用base关键字是错误的。
(3)继承中构造函数与析构函数
在进行类的继承时,派生类构造函数会隐式地调用基类的无参构造函数,但是,如果基类也是从其他派生的,C#会根据层次结构找到最顶层的基类,并调用基类的构造函数,然后依次调用各级派生类的构造函数。析构函数的执行顺序正好与构造函数相反。
(二)多态
动态是面向对象编程的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后直接通过这个对象调用派生类的方法。在C#中,类的多态是通过在派生类中重写基类的虚方法来实现的。
1、虚方法的重写
在类的方法前面加上关键字virtual,则称该方法为虚方法。通过虚方法重写,可以实现在程序运行过程确定调用的方法。重写(还可以称为覆盖)加上在派生类中将基类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限或者修改成员方法的返回值类型。
2、抽象类和抽象方法
如果一个类不与具体的事物相联系,只是表达一种抽象的概念或行为,仅仅是作为其派生类的一个基类,这个类可以被声明为抽象类。在抽象类中声明方法时,如果加上abstract关键字,则为抽象方法。(在类中主要有一个抽象方法,这个类也得被声明为抽象类)。
抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下:
抽象类不能实例化;
抽象类中可以包含抽象成员,但非抽象类中不可用;
抽象类不能被密封
抽象类的具体语法:
访问修饰符 abstract class 类名:基类或接口
{
//类成员
}
抽象方法的注意事项:
抽象方法必须声明在抽象类中。
声明抽象方法时,不能使用virtual、static和private修饰符。
当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体的实现,重写抽象方法时使用override关键字。
3、密封类和密封方法
为了避免滥用继承,C#提出来密封类的概念。密封类可以限制扩展性,如果密封了就不能继承该类;如果密封了某个成员,则派生类不能重写该成员的实现。格式为:
访问修饰符 sealed class 类名:基类或接口
{
//密封类的成员
}
如果类的方法声明中包含sealed修饰符,则该方法为密封方法。密封方法只能用于对基类的虚方法进行实现,因此,声明密封方法时,selead修饰符总是与override修饰符同时使用。
总结
1.什么是继承?其作用是什么?
继承是子类可以沿用父类的某些行为和特征,其作用是代码重用
2.继承的特性有 传递性 、 单根性 、 成员的访问性 。
3.在C#中,派生类会先调用基类的无参构造方法,在调用自身的构造方法。
4.在C#子类中,可以使用 this 关键字访问本类成员,使用 base 关键字访问父类成员。
5. Object 类是所有类的父类。
6.请列举出C#中5种访问修饰符并说明其作用?
public:公共的,访问不受限制;
private:私有的,只能在本类内部访问;
protected:受保护的,只能在本类及其子类访问。
internal:内部的,只限于本项目内成员访问;
prodected internal:内部保护的,只限于本项目或子类访问。
7.类的默认访问修饰符是 internal ,类的成员的默认访问修饰符是 private 。
8.多态的意思是 多种形态 。
9.在C#中,子类使用 new 关键字来达到隐藏父类成员的目的。
10.多态的实现方式有哪两种?隐藏父类方法和方法重写。
11.方法重写的特点?与重载的区别是?
方法重写:发生在父子类中,父子类方法的返回值类型、方法名和参数必须完全相同,子类方法的可访问性不能低于父类方法;
方法重载:同一个类中,方法名相同,参数的个数或类型不同;(与返回值无关);
12.虚方法的关键字是 virtual ,重写的关键字是 override 。
13.密封类的关键字是 sealed ,其主要作用是 防止派生子类 ,密封方法的作用是 不允许子类再次重写 。
14.C#中使用 abstract 关键字类定义抽象类?
15.抽象类的特点?
1)抽象类可以不包含抽象方法,但抽象方法必须包含在抽象类中;
2)抽象方法不允许有方法体;
3)子类继承于抽象类时必须重写抽象类中所有的抽象方法,除非子类也是抽象类。4)抽象类不允许直接实例化,只能实例化其非抽象子类对象。
16.抽象方法与虚方法的区别?
抽象方法:使用abstract修饰,只能定义在抽象类中,不允许有方法体,子类必须重写;虚方法:使用virtual关键字修饰,可以定义在非密封类中,必须有方法体,可以重写。