用《叩响C#之门》复习C#基础知识 第十章 面向对象编程:多态性

时间:2022-05-12 17:25:47

1、派生类的对象和基类的关系(包含关系)

1)整体和局部的 has a 关系

在程序中,数组和它的元素、枚举类型和它的枚举项、结构体和它的成员、类和它的成员之间都是“has a”的关系。

2)个体和种类之间的 is a 关系(属于关系)

在程序中,对象和类之间就是属于关系;在类的继承中,派生类对象和基类之间也是is a 关系

 

2、一般情况下,基类的引用符指向基类的对象,派生类的引用符指向派生类的对象,前面的学习和随笔中已经知道,引用符的类型和对象的类型可以不同。

一个基类的引用符,可以指向多种派生类对象,具有多种不同的形态,这种现象叫做类的多态性。

 

3、有时候,需要确定基类的引用符到底指向了哪种派生类对象,这时,需要用is运算符,is运算符用来判断对象是不是某种类型。

注意:is 是针对对象而言,不论引用符属哪个类型,is只去关心引用符指向的对象类型,不会去管引用符的类型。所有派生类的对象都可以看做是基类的对象。

 

4、类型转换

向上类型转换

由低层次类型转换为高层次类型,称为向上类型转换。如将派生类类型的引用符转换为基类类型的引用符(即将派生类引用符赋给基类的引用符),转换后,基类的引用符不能访问派生类对象特有的函数。这种转换都是自动的隐式转换。

 

向下类型转换

由高层次类型向低层次类型的转换,称为向下类型转换。这种转换必须强制转换,如将基类类型的引用符强制转换为派生类类型的引用符,加括号,括号内为派生类的类型即可。

为了能用基类引用符去访问派生类对象特有的函数,必须将基类引用符强制转换为派生类引用符。但,要先判断基类引用符是否指向要转换的派生类类型所对应的对象(即判断基类型引用符所指向的对象是否为派生类类型)。

当然也可用as运算符执行两个引用符之间的显示转换,这种转换很安全,无需用is运算符进行测试类型,当类型不兼容时,转换的结果是null。

 

5、接口(其实接口本质上可以看作是一个定义了抽象方法的类

在软件领域,实现标准化的一种方法是制定统一的接口(interface)。接口只规定系统具有哪些成员以及每个成员的功能,具体如何实现由各个公司自己设计,也就是说接口为大家制定了一个规范,然后各公司具体实现这个规范。

接口用关键字interface定义,接口的名称习惯上以字母I开头,一般情况下,接口中只能包含成员的声明,不能有任何实现代码。接口的成员总是公有的,不需要也不能添加public等修饰符,也不能声明为虚函数或静态函数。

访问修饰符 interface I开头的接口名

{

方法、属性、事件、索引器,

不能包含构造函数、析构函数、常数和字段等,

接口不能包含任何实现方法,

声明方法时,不能包含public等修饰符,除了new以外,其他修饰也不能用,

声明方法时,只需给出返回类型、方法名、参数列表,并以分号结束。

}

在继承接口的类中,要实现接口的所有成员吗?

实现接口的类的相应成员必须添加public修饰符,并且可以声明为虚函数。

接口引用符也可以指向所有派生类的对象,体现了接口的多态性。

 

接口的继承

新接口也可以继承旧接口,继承方式与类相同。

 

另外,虽然类不允许同时继承多个基类,但允许继承多个接口,也就是说允许一个类同时实现多个接口。当继承的基类型列表包含基类和接口时,基类必须是列表的第一项。