- SAP ABAP 教程
- SAP ABAP - 首页
- SAP ABAP - 概述
- SAP ABAP - 环境
- SAP ABAP - 屏幕导航
- SAP ABAP - 基本语法
- SAP ABAP - 数据类型
- SAP ABAP - 变量
- SAP ABAP - 常量 & 字面量
- SAP ABAP - 运算符
- SAP ABAP - 循环控制
- SAP ABAP - 决策
- SAP ABAP - 字符串
- SAP ABAP - 日期 & 时间
- SAP ABAP - 数据格式化
- SAP ABAP - 异常处理
- SAP ABAP - 字典
- SAP ABAP - 域
- SAP ABAP - 数据元素
- SAP ABAP - 表
- SAP ABAP - 结构
- SAP ABAP - 视图
- SAP ABAP - 搜索帮助
- SAP ABAP - 锁对象
- SAP ABAP - 模块化
- SAP ABAP - 子程序
- SAP ABAP - 宏
- SAP ABAP - 函数模块
- SAP ABAP - 包含程序
- SAP ABAP - Open SQL 概述
- SAP ABAP - Native SQL 概述
- SAP ABAP - 内部表
- SAP ABAP - 创建内部表
- ABAP - 填充内部表
- SAP ABAP - 复制内部表
- SAP ABAP - 读取内部表
- SAP ABAP - 删除内部表
- SAP ABAP - 面向对象
- SAP ABAP - 对象
- SAP ABAP - 类
- SAP ABAP - 继承
- SAP ABAP - 多态性
- SAP ABAP - 封装
- SAP ABAP - 接口
- SAP ABAP - 对象事件
- SAP ABAP - 报表编程
- SAP ABAP - 对话编程
- SAP ABAP - 智能表单
- SAP ABAP - SAPscript
- SAP ABAP - 客户出口
- SAP ABAP - 用户出口
- SAP ABAP - 业务附加功能
- SAP ABAP - Web Dynpro
- SAP ABAP 有用资源
- SAP ABAP - 问答
- SAP ABAP - 快速指南
- SAP ABAP - 有用资源
- SAP ABAP - 讨论
SAP ABAP - 多态性
术语“多态性”字面意思是“多种形式”。从面向对象的角度来看,多态性与继承一起工作,使继承树中的各种类型可以互换使用。也就是说,当存在类层次结构并且它们通过继承相关联时,就会发生多态性。ABAP 多态性意味着对方法的调用将导致执行不同的方法,具体取决于调用该方法的对象类型。
以下程序包含一个抽象类“class_prgm”、2 个子类(class_procedural 和 class_OO)以及一个测试驱动程序类“class_type_approach”。在此实现中,类方法“start”允许我们显示编程类型及其方法。如果您仔细查看方法“start”的签名,您会注意到它接收类型为 class_prgm 的导入参数。但是,在 Start-Of-Selection 事件中,此方法已在运行时使用 class_procedural 和 class_OO 类型的对象被调用。
示例
Report ZPolymorphism1. CLASS class_prgm Definition Abstract. PUBLIC Section. Methods: prgm_type Abstract, approach1 Abstract. ENDCLASS. CLASS class_procedural Definition Inheriting From class_prgm. PUBLIC Section. Methods: prgm_type Redefinition, approach1 Redefinition. ENDCLASS. CLASS class_procedural Implementation. Method prgm_type. Write: 'Procedural programming'. EndMethod. Method approach1. Write: 'top-down approach'. EndMethod. ENDCLASS. CLASS class_OO Definition Inheriting From class_prgm. PUBLIC Section. Methods: prgm_type Redefinition, approach1 Redefinition. ENDCLASS. CLASS class_OO Implementation. Method prgm_type. Write: 'Object oriented programming'. EndMethod. Method approach1. Write: 'bottom-up approach'. EndMethod. ENDCLASS. CLASS class_type_approach Definition. PUBLIC Section. CLASS-METHODS: start Importing class1_prgm Type Ref To class_prgm. ENDCLASS. CLASS class_type_approach IMPLEMENTATION. Method start. CALL Method class1_prgm→prgm_type. Write: 'follows'. CALL Method class1_prgm→approach1. EndMethod. ENDCLASS. Start-Of-Selection. Data: class_1 Type Ref To class_procedural, class_2 Type Ref To class_OO. Create Object class_1. Create Object class_2. CALL Method class_type_approach⇒start Exporting class1_prgm = class_1. New-Line. CALL Method class_type_approach⇒start Exporting class1_prgm = class_2.
以上代码产生以下输出:
Procedural programming follows top-down approach Object oriented programming follows bottom-up approach
ABAP 运行时环境在导入参数 class1_prgm 的赋值期间执行隐式缩小转换。此功能有助于以通用方式实现“start”方法。与对象引用变量关联的动态类型信息允许 ABAP 运行时环境动态地将方法调用绑定到对象引用变量指向的对象中定义的实现。例如,类“class_type_approach”中方法“start”的导入参数“class1_prgm”指的是一个抽象类型,它本身永远无法实例化。
每当使用具体子类实现(例如 class_procedural 或 class_OO)调用该方法时,class1_prgm 引用参数的动态类型就会绑定到这些具体类型之一。因此,对方法“prgm_type”和“approach1”的调用指的是 class_procedural 或 class_OO 子类中提供的实现,而不是类“class_prgm”中提供的未定义抽象实现。