Учебники

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_prgmprgm_type. 
Write: 'follows'. 

CALL Method class1_prgmapproach1. 
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_approachstart 
Exporting 

class1_prgm = class_1. 
New-Line. 
CALL Method class_type_approachstart 
Exporting 
class1_prgm = class_2.  

Приведенный выше код производит следующий вывод —

Procedural programming follows top-down approach  
Object oriented programming follows bottom-up approach

Среда выполнения ABAP выполняет неявное сужение приведения во время назначения импортирующего параметра class1_prgm. Эта функция помогает методу start запускаться в общем. Информация динамического типа, связанная с переменной ссылки на объект, позволяет среде выполнения ABAP динамически связывать вызов метода с реализацией, определенной в объекте, на который указывает переменная ссылки на объект. Например, параметр импорта «class1_prgm» для метода «start» в классе «class_type_approach» относится к абстрактному типу, который никогда не может быть создан сам по себе.

Всякий раз, когда метод вызывается с конкретной реализацией подкласса, такой как class_procedural или class_OO, динамический тип ссылочного параметра class1_prgm привязывается к одному из этих конкретных типов. Следовательно, вызовы методов ‘prgm_type’ и ‘подхода1’ ссылаются на реализации, предоставленные в подклассах class_procedural или class_OO, а не на неопределенные абстрактные реализации, представленные в классе ‘class_prgm’.