Одним из наиболее важных понятий в объектно-ориентированном программировании является наследование. Наследование позволяет нам определять класс в терминах другого класса, что облегчает создание и поддержку приложения. Это также дает возможность повторно использовать функциональность кода и быстрое время реализации.
При создании класса вместо написания совершенно новых элементов данных и методов программист может указать, что новый класс должен наследовать членов существующего класса. Этот существующий класс называется базовым классом или суперклассом , а новый класс называется производным классом или подклассом .
-
Объект одного класса может приобретать свойства другого класса.
-
Производный класс наследует данные и методы суперкласса. Однако они могут перезаписывать методы, а также добавлять новые методы.
-
Основным преимуществом наследования является возможность повторного использования.
Объект одного класса может приобретать свойства другого класса.
Производный класс наследует данные и методы суперкласса. Однако они могут перезаписывать методы, а также добавлять новые методы.
Основным преимуществом наследования является возможность повторного использования.
Отношения наследования задаются с помощью дополнения 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
Контроль доступа и наследование
Производный класс может получить доступ ко всем не закрытым членам своего базового класса. Таким образом, члены суперкласса, которые не должны быть доступны для функций-членов подклассов, должны быть объявлены закрытыми в суперклассе. Мы можем суммировать различные типы доступа в зависимости от того, кто может получить к ним доступ следующим образом —
Доступ | общественного | защищенный | Частный |
---|---|---|---|
Та же кальс | да | да | да |
Производный класс | да | да | нет |
Вне класса | да | нет | нет |
При выводе класса из суперкласса он может наследоваться посредством открытого, защищенного или частного наследования. Тип наследования определяется спецификатором доступа, как описано выше. Мы почти не используем защищенное или частное наследование, но обычно используется публичное наследование. Следующие правила применяются при использовании различных типов наследования.
-
Публичное наследование. При выводе класса из открытого суперкласса публичные члены суперкласса становятся открытыми членами подкласса, а защищенные члены суперкласса становятся защищенными членами подкласса. Закрытые члены суперкласса никогда не доступны напрямую из подкласса, но доступ к ним можно получить посредством звонков общедоступным и защищенным членам суперкласса.
-
Защищенное наследование — При наследовании от защищенного суперкласса публичные и защищенные члены суперкласса становятся защищенными членами подкласса.
-
Частное наследование — При наследовании от частного суперкласса публичные и защищенные члены суперкласса становятся частными членами подкласса.
Публичное наследование. При выводе класса из открытого суперкласса публичные члены суперкласса становятся открытыми членами подкласса, а защищенные члены суперкласса становятся защищенными членами подкласса. Закрытые члены суперкласса никогда не доступны напрямую из подкласса, но доступ к ним можно получить посредством звонков общедоступным и защищенным членам суперкласса.
Защищенное наследование — При наследовании от защищенного суперкласса публичные и защищенные члены суперкласса становятся защищенными членами подкласса.
Частное наследование — При наследовании от частного суперкласса публичные и защищенные члены суперкласса становятся частными членами подкласса.
Переопределение методов в подклассе
Методы суперкласса могут быть повторно реализованы в подклассе. Несколько правил переопределения методов —
-
Оператор переопределения для унаследованного метода должен находиться в том же разделе, что и определение исходного метода.
-
Если вы переопределите метод, вам не нужно будет снова вводить его интерфейс в подкласс, а только имя метода.
-
В переопределенном методе вы можете получить доступ к компонентам прямого суперкласса, используя ссылку super.
-
Псевдо-ссылка super может использоваться только в переопределенных методах.
Оператор переопределения для унаследованного метода должен находиться в том же разделе, что и определение исходного метода.
Если вы переопределите метод, вам не нужно будет снова вводить его интерфейс в подкласс, а только имя метода.
В переопределенном методе вы можете получить доступ к компонентам прямого суперкласса, используя ссылку super.
Псевдо-ссылка 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, приведенный выше код выдаст следующий вывод: