ABAP Objects

Objektorientiertes ABAP für moderne Clean Core SAP Systeme

Abstrakte Klassen

Abstrakte Klasse

Definition Wikipedia

Eine abstrakte Klasse bezeichnet in der objektorientierten Programmierung eine spezielle Klasse, welche sich per Definition nicht instanziieren lässt, d. h., es lassen sich keine Objekte von ihr erzeugen, und dient somit lediglich als Strukturelement innerhalb einer Klassenhierarchie.

Abstrakte Klassen in ABAP Objects

  • Abstrakte Klassen können mit dem Zusatz ABSTRACT definiert werden
  • Es können keine Objektinstanzen von einer abstrakten Klasse erzeugt werden
  • Abstrakte Klassen dienen als Vorlage für Unterklassen
  • Zusätzlich können abstrakte Methoden durch den Zusatz ABSTRACT definiert werden:
    • erbende Unterklassen müssen diese durch REDEFINITION implementieren (keine super-><method> verfügbar)
    • statische Methoden können nicht abstrakt sein
  • Abstrakte Klassen können nicht-abstrakte Methoden mit Implementierungen enthalten

Anwendungsbeispiel Würfel

Würfelset

  • Jeder Würfel - für ein Würfelspiel - lässt sich durch die Anzahl verfügbarer Seiten und durch die darauf abgebildeten Symbole abstrakt beschreiben
  • Die Bedeutung der Seiten, weitere Eigenschaften und Fähigkeiten ergeben sich erst durch weitere Konkretisierungen
  • Damit sind die Mindestanforderungen an eine abstrakte Würfel-Klasse beschrieben:
    • Methoden: getFaceCount(), getFaces(), getFace(number)
    • Attribute: string[] faces
  • Die Unterklassen ergänzen Bedeutungen, Eigenschaften und Fähigkeiten: z.B. Standard-6-Seiten-Würfel, Rollenspiel-Würfel, Farb-Würfel, Mathe-Würfel, ...
  • Ein Erweiterungskonzept für die Erben ist ggf. vorgegeben

Übung "Würfelwerkstatt"

Überblick

Es wird eine abstrakte Klasse erstellt, die eine abstrakte Methode, nicht-abstrakte Methoden mit Implementierungen und ein geschütztes Attribut enthält. Eine weitere Unterklasse erbt von der abstrakten Oberklasse und redefiniert die abstrakte Methode.


Lernziele

  • Wiederholung aus Teil 1:
    • Klassen über Eclipse anlegen und bearbeiten
    • Methoden und Attribute pflegen
    • Vererbung nutzen
  • Quick-Fix bei abstrakten Klassen kennenlernen
  • Bestätigen, dass abstrakte Klassen nicht instanziiert werden können

Würfelwerkstatt

Code-Beispiel der Übung "Würfelwerkstatt"

Abstrakte Würfel-Klasse

CLASS zcl_bc_aoo_##_die_acl DEFINITION 
PUBLIC ABSTRACT CREATE PUBLIC.
  PUBLIC SECTION.
    METHODS get_Faces RETURNING VALUE(rt_faces) TYPE string_table.
    METHODS get_Face_Count RETURNING VALUE(rv_face_count) TYPE i.
    METHODS get_Face IMPORTING iv_face_number TYPE i RETURNING VALUE(rv_face) TYPE string.
  PROTECTED SECTION.
    DATA: mt_faces TYPE string_table.
    METHODS: initialize_faces ABSTRACT.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_bc_aoo_##_die_acl IMPLEMENTATION.
  METHOD get_faces.
    IF mt_faces IS INITIAL.
      initialize_faces(  ).
    ENDIF.
    rt_faces = mt_faces.
  ENDMETHOD.

  METHOD get_face_count.
    rv_face_count = lines( get_faces(  ) ).
  ENDMETHOD.

  METHOD get_face.
    DATA(mt_faces) = get_faces(  ).
    rv_face = VALUE #( mt_faces[ iv_face_number ] OPTIONAL ).
  ENDMETHOD.
ENDCLASS.

Erbende Unterklasse (Standard Würfel mit 6 Seiten/Zahlen)

CLASS zcl_bc_aoo_##_die_acl_child DEFINITION
  PUBLIC INHERITING FROM zcl_bc_aoo_##_die_acl CREATE PUBLIC .
  PUBLIC SECTION.
  PROTECTED SECTION.
    METHODS: initialize_faces REDEFINITION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_bc_aoo_##_die_acl_child IMPLEMENTATION.
  METHOD initialize_faces.
    IF mt_faces IS INITIAL.
      DATA(lv_face_number) = 1.
      WHILE lv_face_number < 7.
        APPEND |{ lv_face_number }| TO mt_faces.
        lv_face_number += 1.
      ENDWHILE.
    ENDIF.
  ENDMETHOD.
ENDCLASS.
" DATA(lo_instance) = NEW zcl_bc_aoo_##_die_acl(  ). "<- not allowed
DATA(lo_instance) = NEW zcl_bc_aoo_##_die_acl_child(  ).