SAP ABAP - Наследование

Одна из наиболее важных концепций объектно-ориентированного программирования - это наследование. Наследование позволяет нам определять класс в терминах другого класса, что упрощает создание и поддержку приложения. Это также дает возможность повторно использовать функциональность кода и быстрое время реализации.

При создании класса вместо написания полностью новых элементов данных и методов программист может указать, что новый класс должен наследовать члены существующего класса. Этот существующий класс называетсяbase class или же super class, а новый класс называется derived class или же sub class.

  • Объект одного класса может приобретать свойства другого класса.

  • Производный класс наследует данные и методы суперкласса. Однако они могут перезаписывать методы, а также добавлять новые методы.

  • Главное преимущество наследования - возможность повторного использования.

Отношения наследования указываются с помощью дополнения «INHERITING FROM» к оператору определения класса.

Ниже приводится синтаксис -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

пример

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

Приведенный выше код дает следующий вывод -

This is public data 
Method in child class 
This is public data

Контроль доступа и наследование

Производный класс может получить доступ ко всем не закрытым членам своего базового класса. Таким образом, члены суперкласса, которые не должны быть доступны для функций-членов подклассов, должны быть объявлены частными в суперклассе. Мы можем суммировать различные типы доступа в зависимости от того, кто может получить к ним доступ, следующим образом:

Доступ Общественные Защищено Частный
То же самое да да да
Производный класс да да Нет
Вне класса да Нет Нет

При наследовании класса от суперкласса он может быть унаследован через публичное, защищенное или частное наследование. Тип наследования определяется спецификатором доступа, как описано выше. Мы почти не используем защищенное или частное наследование, но обычно используется публичное наследование. Следующие правила применяются при использовании различных типов наследования.

  • Public Inheritance- При наследовании класса от общедоступного суперкласса открытые члены суперкласса становятся общедоступными членами подкласса, а защищенные члены суперкласса становятся защищенными членами подкласса. Частные члены суперкласса никогда не доступны напрямую из подкласса, но могут быть доступны через вызовы публичных и защищенных членов суперкласса.

  • Protected Inheritance - При наследовании от защищенного суперкласса открытые и защищенные члены суперкласса становятся защищенными членами подкласса.

  • Private Inheritance - При наследовании от частного суперкласса открытые и защищенные члены суперкласса становятся закрытыми членами подкласса.

Переопределение методов в подклассе

Методы суперкласса могут быть повторно реализованы в подклассе. Несколько правил переопределения методов -

  • Оператор переопределения для унаследованного метода должен находиться в том же разделе, что и определение исходного метода.

  • Если вы переопределяете метод, вам не нужно снова вводить его интерфейс в подклассе, а только имя метода.

  • В переопределенном методе вы можете получить доступ к компонентам прямого суперкласса, используя супер-ссылку.

  • Псевдоссылка super может использоваться только в переопределенных методах.

пример

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

После выполнения F8, если мы введем значения 9 и 10, приведенный выше код выдаст следующий результат:

Redefinition Demo 
29