首页 理论教育 多态性实现不同结果的方法覆盖

多态性实现不同结果的方法覆盖

时间:2023-06-27 理论教育 版权反馈
【摘要】:例如,功能块通过覆盖方法,获得新的方法,这些不同的覆盖方法能使执行的结果不同,这就是多态性。面向对象的功能块的多态性,其特点是动态名绑定,即根据程序运行期不同执行情况有不同结果。图1-41 例1-70图2)输入-输出变量的多态性。

多态性实现不同结果的方法覆盖

面向对象的功能块的多态性指对同一功能块,由于继承、覆盖和引用的不同而有不同的响应或行为。例如,功能块通过覆盖方法,获得新的方法,这些不同的覆盖方法能使执行的结果不同,这就是多态性。面向对象的功能块的多态性,其特点是动态名绑定,即根据程序运行期不同执行情况有不同结果。面向对象的功能块具有下列四种多态性。

1.接口的多态性

接口的多态性指面向对象的功能块可用多接口实现不同的行为。

接口不能实例化,只有派生功能块或派生类可以赋值给一个接口引用。因此,经接口引用的一个方法的任意调用是动态绑定的。

通过接口,功能块可实现多接口,功能块也可实现多接口,即接口的多态性。

2.输入-输出变量的多态性

输入-输出变量的多态性指对同样的功能块,由于输入-输出变量的不同而有不同的功能块输出结果。

(1)有VAR_IN_OUT变量和相同的方法签名

如果派生功能块没有附加的VAR_IN_OUT变量,相同类型的VAR_IN_OUT变量可赋值给一个派生功能块的实例。派生功能块是否有VAR_INPUT或VAR_OUTPUT变量被赋值由实施者规定。

(2)有VAR_IN_OUT变量和兼容的方法签名

一个(基)功能块的VAR_IN_OUT变量可赋值给一个派生功能块的实例,而没有附加的VAR_IN_OUT变量。

因此,用VAR_IN_OUT变量的功能块和功能块的方法调用是动态绑定的。

例1-70】输入-输出变量的多态性(见图1-41)。

1)定义基功能块和派生功能块。

978-7-111-59695-0-Chapter01-210.jpg

978-7-111-59695-0-Chapter01-211.jpg

图1-41 例1-70图

2)输入-输出变量的多态性。

978-7-111-59695-0-Chapter01-212.jpg

3.引用的多态性

引用的多态性指对同一个功能块,由于引用的不同而有不同的功能块输出结果。

派生类实例可将一个引用赋值到一个基类。

(1)相同方法签名的引用(www.xing528.com)

相同类型的一个变量可赋值到派生功能块类型的引用,而不需要附加的VAR_IN_OUT变量、VAR_INPUT或VAR_OUTPUT变量。(基)功能块的引用可赋值给派生功能块实例的地址而不需要附加的VAR_IN_OUT变量、VAR_INPUT或VAR_OUTPUT变量。到派生功能块的引用是否有VAR_INPUT或VAR_OUTPUT变量被赋值由实施者规定。

因此,采用解引用的功能块和功能块的方法调用是动态绑定的。

(2)兼容方法签名的引用

(基)功能块的引用可赋值给派生功能块实例的地址而不需要附加的VAR_IN_OUT变量。

例1-71】引用的多态性。

1)定义基类和派生类。

978-7-111-59695-0-Chapter01-213.jpg

978-7-111-59695-0-Chapter01-214.jpg

2)定义功能块。

978-7-111-59695-0-Chapter01-215.jpg

3)引用的多态性。

978-7-111-59695-0-Chapter01-216.jpg

(3)引用和调用

引用是一个变量的别名,因此,调用一个引用时,只将指向的对象地址传递给用户,然后用户根据地址做有关操作。

调用是一个操作,它是对象和对象之间交互时相互做的动作。调用是将本类或其他类内的对象、方法或属性调过来使用。

引用的调用用于函数的参数传递,使用引用的调用,可在子函数中对形式参数所做的更改对主函数中的实际参数有效。

声明一个引用时,必须同时对引用进行初始化,使它指向已存在的对象。一旦引用被初始化,就不能改为指向其他对象,即引用是一个变量的别名,而且该别名不能改变。

引用作为形式参数时,形式参数的初始化不在类型声明时进行,而在执行主调函数的调用表达式时,才为形参分配内存空间,同时用实参来初始化形参。这样引用类型的形参就通过形实结合,成为实参的一个别名,对形参的任何操作也就会直接作用于实参。

4.THIS的多态性

在运行期,THIS可支持一个引用到当前的功能块类型或它的所有派生的功能块类型。因此,采用THIS的一个功能块方法的任何调用都是动态绑定的。

对于功能块类型或方法是FINAL属性,或如果没有输入-输出变量的派生功能块的特殊情况,在编译时确定是一个引用或THIS调用。这时,不必动态绑定。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈