刘波的学习园地

让我们一起进步!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

6.继承

Posted on 2006-11-09 14:42  Loes  阅读(269)  评论(0编辑  收藏  举报

     继承机制的存在与否是面向对象程序设计和面向过程程序设计之间的一个显著差异,通过继承可以 将类组织成一个具有合理层次结构的系统,形成从上到下的等级关系,实现有条理,易于控制的类似类之间的代码复用和多态性。实际上,ABAP中所有类都是默认继承系统的空类OBJECT。
1. 继承的基本概念
    面向对象程序设计中的继承通过创建基类和其派生类来实现。通过类的等级关系的构建,处于底层的子类可以自动继承其祖先类的部分功能。
    在类定义时,使用inherting form附加项可以指定派生类和基类之间的继承关系。一个派生类包含所有位于其上方的类成员,并且可以访问其中的公用成员和被保护成员。
    ABAP中的继承为单一继承,即一个类可以有多个派生类,但只能由一个直接的基类。这一原则减少了继承过程中的复杂性。
    在继承过程中各成员的可见性如下:
    一个派生类中的公有成员包括其本身公有部分定义的成员以及所有基类公有成员,以此类推。这些公有成员可以通过组件选择运算符“-〉”在类外部获得。
    一个派生类中的被保护成员包括其本身被保护部分定义的成员以及其所有基类的被保护成员。这些成员不能通过组件选择符“-〉”在外部获得,但可以在派生类内部使用。除去可继承性之外,在类外部看,其行为与类私有成员完全一致。
    一个派生类中的私有成员只包括其本身私有部分定义的成员。这些成员只能在派生类内部使用。
    因而,继承类和基类的公有成员和被保护成员享有共同的命名空间,而私有成员则在不同类之间可以出现重名的情况。
2. 多态性的继承实现
    多态性,意味着相同的用户操作在不同类中有不同的实现形式。如驾驶员对于汽车和轮船均加速一次,轮船速度增加1,汽车的速度则可能增加2。在继承中,多态性是通过方法重载及引用变量实现的,即子类可以重新定义并以不同的方式实现基类中的公有或保护方法,此时基类中的方法需为实例方法。在派生类的声明部分,需要进行如下声明:
    Method meth definition.
    该方法必须和基类中的方法具有相同的接口,但可以通过不同的代码实现。如果有一个相同的基类,包含多个派生类,则这些派生类都可以重新定义实例方法,从类用户的角度讲,不同的类中都存在该操作,但具体实现过程各有不同。当访问基类时,将采取基类中的原始方法实现;访问各派生类时,则采用新的派生类方法实现,原有的基类方法被屏蔽,包括通过自身运算符“me-〉”调用的方法。
    在方法重载过程中,如果派生类内部仍然需要使用基类中的方法,则可以使用super关键字来指定其基类。
    call method super->meth
    只有在重载实现代码内部才能使用关键字调用方法。

REPORT z_method_redefinition.

*---------------------------------------------------------------------*
*       CLASS vehicle DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS vehicle DEFINITION INHERITING FROM object.
  PUBLIC SECTION.
    METHODS: accelerate,write_status.
  PROTECTED SECTION.
    DATA speed TYPE i.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS plane DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS plane DEFINITION INHERITING FROM vehicle.
  PUBLIC SECTION.
    METHODS: rise,write_status REDEFINITION.
  PROTECTED SECTION.
    DATA altitude TYPE i.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS ship DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS ship DEFINITION INHERITING FROM vehicle.
  PUBLIC SECTION.
    METHODS write_status REDEFINITION.
ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS vehicle IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS vehicle IMPLEMENTATION.
  METHOD accelerate.
    speed = speed + 1.
  ENDMETHOD.
  METHOD write_status.
    WRITE: / 'Speed',speed.
  ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS plane IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS plane IMPLEMENTATION.
  METHOD rise.
    altitude = altitude + 1.
  ENDMETHOD.
  METHOD write_status.
    WRITE / 'Plane:'.
    CALL METHOD super->write_status.
    WRITE: / 'Altitude:',altitude.
  ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS ship IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS ship IMPLEMENTATION.
  METHOD write_status.
    WRITE: / 'Ship speed:',speed.
  ENDMETHOD.
ENDCLASS.

DATA: plane_ref TYPE REF TO plane,
      ship_ref TYPE REF TO ship.

START-OF-SELECTION.
  create object: plane_ref,ship_ref.
  CALL METHOD: plane_ref->accelerate,
               plane_ref->rise,
               plane_ref->write_status,
               ship_ref->accelerate,
               ship_ref->write_status.
该示例输出如下:
plane:
speed: 1
altitude: 1
ship speed 1
在该程序中,类ship和plane对基类vehicle中定义的方法accelerate进行重载,根据引用变量所参照的类,相同的方法存在不同的实现方式。

3. 抽象类和最终类
    有时一个基类包含多个派生类,但该基类只是作为模板出现的,并不需要有任何对象作为实例,则可以将该类声明为抽象类(Abstract Class).
    class class definition abstract.
    ........
    endclass.
    抽象类不能使用create object语句创建对象,其主要目的是为了做派生类的模板,实际使用的对象则依照各个派生类创建。
    也可以将方法被定义为抽象方法:
    method meth abstract ....
    一个抽象方法不能在类本身中被实现,而必须在其派生出的非抽象类中实现。因而含有抽象方法的类必须被定义成抽象类。在派生类的实现过程中,即使用definition关键字对该抽象方法进行重新定义,其唯一区别在于抽象方法重新定义过程中不能使用super关键字调用该抽象方法。

    最终类(final class),是不能被继承的类。其主要的意义在于:设计过程中,如果一个类(尤其是全局类)有很多级别的派生类,则其中公有和保护成员方法与之相关,随意改动该类时,很容易造成派生类中的语法和语义冲突。因而,如果不希望在程序中队继续对该类进行派生,则可以定义该类为最终类。
    class class definition final.
    .....
    endclass.
    最终方法是不可以重新定义的方法,不一定出现在最终类中,但最终类中的所有方法都是最终方法,因而无须指明final关键字,一般类中的最终方法则需要下述语句指明:
    method meth abstract .....
    一个最终类可以同时为抽象类,但此时类中只能包含静态成员。一个最终方法则不可以同时是抽象方法,因为这是没有任何意义的。