面向对象的功能块的多态性指对同一功能块,由于继承、覆盖和引用的不同而有不同的响应或行为。例如,功能块通过覆盖方法,获得新的方法,这些不同的覆盖方法能使执行的结果不同,这就是多态性。面向对象的功能块的多态性,其特点是动态名绑定,即根据程序运行期不同执行情况有不同结果。面向对象的功能块具有下列四种多态性。
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)定义基功能块和派生功能块。
图1-41 例1-70图
2)输入-输出变量的多态性。
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)定义基类和派生类。
2)定义功能块。
3)引用的多态性。
(3)引用和调用
引用是一个变量的别名,因此,调用一个引用时,只将指向的对象地址传递给用户,然后用户根据地址做有关操作。
调用是一个操作,它是对象和对象之间交互时相互做的动作。调用是将本类或其他类内的对象、方法或属性调过来使用。
引用的调用用于函数的参数传递,使用引用的调用,可在子函数中对形式参数所做的更改对主函数中的实际参数有效。
声明一个引用时,必须同时对引用进行初始化,使它指向已存在的对象。一旦引用被初始化,就不能改为指向其他对象,即引用是一个变量的别名,而且该别名不能改变。
引用作为形式参数时,形式参数的初始化不在类型声明时进行,而在执行主调函数的调用表达式时,才为形参分配内存空间,同时用实参来初始化形参。这样引用类型的形参就通过形实结合,成为实参的一个别名,对形参的任何操作也就会直接作用于实参。
4.THIS的多态性
在运行期,THIS可支持一个引用到当前的功能块类型或它的所有派生的功能块类型。因此,采用THIS的一个功能块方法的任何调用都是动态绑定的。
对于功能块类型或方法是FINAL属性,或如果没有输入-输出变量的派生功能块的特殊情况,在编译时确定是一个引用或THIS调用。这时,不必动态绑定。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。