SAP ABAP - 继承

  • 简述

    面向对象编程中最重要的概念之一是继承。继承允许我们根据另一个类来定义一个类,这使得创建和维护应用程序变得更加容易。这也提供了重用代码功能和快速实施时间的机会。
    创建类时,程序员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和方法。这个现有的类称为基类或者父类,新的类被称为派生类或者子类.
    • 一个类的对象可以获取另一类的属性。
    • 派生类继承超类的数据和方法。但是,它们可以覆盖方法并添加新方法。
    • 继承的主要优点是可重用性。
    继承关系是通过在类定义语句中添加“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 protected private
    同一个类 yes yes yes
    派生类 yes yes no
    类外面 yes no no
    当从超类派生类时,可以通过公共继承、受保护继承或私有继承来继承该类。继承类型由访问说明符指定,如上所述。我们很少使用受保护或私有继承,但常用公共继承。使用不同类型的继承时应用以下规则。
    • Public Inheritance− 当从公共超类派生类时,超类的公共成员将成为子类的公共成员,超类的受保护成员将成为子类的受保护成员。超类的私有成员永远不能从子类直接访问,但可以通过调用超类的公共和受保护成员来访问。
    • Protected Inheritance− 当派生自受保护的超类时,超类的公共成员和受保护成员将成为子类的受保护成员。
    • Private Inheritance− 当派生自私有超类时,超类的公共成员和受保护成员将成为子类的私有成员。
  • 重新定义子类中的方法

    超类的方法可以在子类中重新实现。重新定义方法的规则很少 -
    • 继承方法的重新定义语句必须与原始方法的定义位于同一节中。
    • 如果重新定义一个方法,则不需要在子类中再次进入它的接口,只需要输入方法的名称即可。
    • 在重新定义的方法中,您可以使用 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,上面的代码会产生以下输出 -
    重新实现 os 子类
    
    Redefinition Demo 
    29