Термин полиморфизм буквально означает «много форм». С объектно-ориентированной точки зрения полиморфизм работает в сочетании с наследованием, чтобы сделать возможным взаимозаменяемое использование различных типов в дереве наследования. То есть полиморфизм возникает, когда существует иерархия классов, и они связаны наследованием. Полиморфизм 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 динамически связывать вызов метода с реализацией, определенной в объекте, на который указывает переменная ссылки на объект. Например, параметр импорта «class1_prgm» для метода «start» в классе «class_type_approach» относится к абстрактному типу, который никогда не может быть создан сам по себе.
Всякий раз, когда метод вызывается с конкретной реализацией подкласса, такой как class_procedural или class_OO, динамический тип ссылочного параметра class1_prgm привязывается к одному из этих конкретных типов. Следовательно, вызовы методов ‘prgm_type’ и ‘подхода1’ ссылаются на реализации, предоставленные в подклассах class_procedural или class_OO, а не на неопределенные абстрактные реализации, представленные в классе ‘class_prgm’.