Lokale Klassendefinition in globaler Klasse Thema ist als GELÖST markiert

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

Lokale Klassendefinition in globaler Klasse

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Hallo zusammen, ich hätte da mal gerne wieder ein Problem...

Ich rufe Transaktion SE24 auf und lege die Klasse ZCL_TT an.
In dieser Klasse definiere ich die Methode TESTE_MICH.


Dann Springe ich in [_Lokale Definitionen/ Implementierungen_] und lege eine lokale Klasse LCL_TEST an.

Code: Alles auswählen.

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    DATA flag TYPE c LENGTH 1.
ENDCLASS.
Nun möchte ich diese Klasse als Typ in meiner Methode verwenden:

Code: Alles auswählen.

    METHODS testemich
      IMPORTING
        !object TYPE REF TO lcl_test .
Wenn ich die lokale Klasse in die Parameter eintrage (Formularbasiert), dann wird sie auch nicht als fehlerhaft erkannt und mit einem Doppelklick kann ich auch dorthin verzweigen.

Aber nun: Nun möchte ich die Klasse aktivieren.
SAP möchte das aber nicht:
Syntaxchecker hat geschrieben:Public Section ZCL_TT
Der Typ "LCL_TEST" ist unbekannt.
Dabei ist es egal, ob ich die lokale Klasse in Lokale Definitionen/ Implementierungen oder in Klassenrelevante Lokale Definitionen schreibe.

Was. mache. ich. verkehrt?


Re: Lokale Klassendefinition in globaler Klasse

Beitrag von a-dead-trousers (Top Expert / 3659 / 131 / 953 ) »
Eine LOKALE Klasse kann nicht Teil einer PUBLIC oder PROTECTED Definition sein. Nur in den PRIVATE Schnittstellen kannst du diese Klassen verwenden.
Wenn du das Objekt dennoch nach "außen" durchreichen möchtest, geht das nur über ein generisches TYPE REF TO OBJECT und ein Zugriff darauf dann nur mittels dynamischer Methodenaufrufe bzw. dirty-assign für die Attribute.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Danke für deine nächtliche Antwort, adt!

Aber: Auch wenn ich die Methode als PRIVATE kennzeichne, bekomme ich den gleichen Fehler.
Plus: Dass der lokale Typ nicht nach außen verwendet werden darf, leuchtet mir ja sogar ein, denn es ist ja fast sinnlos, eine Schnittstelle anzubieten, die nur intern bekannt ist.
Allerdings möchte ich mindesten PROTECTED haben, denn ich möchte Ableitungen von der Klasse verwenden. Ich verwende die Methoden zwar nur innerhalb der Klasse, aber selbst wenn PRIVATE funktionieren würde, hätte ich ja keine Chance, mit Vererbung zu arbeiten.
Und da ich die lokale Klasse wirklich nur innerhalb dieser Klasse bzw. evtl. Ableitungen davon verwenden möchte, möchte ich ungerne eine globale Klasse für meine Hilfsklasse anlegen. Es wird mir aber wohl kaum was anderes übrig bleiben... :(

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von ralf.wenzel (Top Expert / 3570 / 167 / 244 ) »
Das ist aber schlüssig, dass eine lokale Klasse nur private (also lokal) verfügbar ist. Was hilft: Globale abstrakte Klasse definieren und lokal von dieser erben. Ist nicht ganz dasselbe was du willst, aber es hilft vielleicht. Ich mache das bei Testklassen so, aber mit einer konkreten statt einer abstrakten Klasse. Die eigentliche (lokale) Testklasse ist dann nur eine Vererbung der globalen Klasse.

Ralf

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
ralf.wenzel hat geschrieben:Das ist aber schlüssig, dass eine lokale Klasse nur private (also lokal) verfügbar ist.
Dann müsste sie ja aber in einer privaten Methode verfügbar sein (Schnittstelle) aber das funktioniert nicht.
ralf.wenzel hat geschrieben:Was hilft: Globale abstrakte Klasse definieren und lokal von dieser erben. Ist nicht ganz dasselbe was du willst, aber es hilft vielleicht.
Das ist eine gute Idee! Dann muss ich zwar eine globale Klasse definieren, aber nur eine.
Danke!

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von black_adept (Top Expert / 3522 / 71 / 696 ) »
Hi Enno,

du kannst auch die TEST_MICH-Methode auch protected machen, ohne dass ein Syntaxfehler auftritt - allerdings musst du dafür die Klasse selber auf "Final" stellen :o
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Welches Release? in unserem 750-System geht's nicht. :(

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von black_adept (Top Expert / 3522 / 71 / 696 ) »
7.01
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von a-dead-trousers (Top Expert / 3659 / 131 / 953 ) »
Wenn du die Schnittstelle für "außerhalb" brauchst, leg doch einfach ein Interface dafür an und lass deine lokale Testklasse dieses implementieren. Damit ist die Funktionalität in deiner Hauptklasse gebündelt aber global bzw. von den Ableitungen her aufrufbar. siehe z.B. die IXML-Interfaces/Klassen
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von msfox (Specialist / 153 / 31 / 23 ) »
Ich krame mal diesen älteren Thread wieder hervor, weil ich ähnliches Problem habe. Allerdings mit einem Interace und einem privaten Attribute:
Ich habe ein lokales Interfaces definiert. Dieses möchte in der globalen Klasse als "private" Attribute verwenden. Beim Aktivieren kommt allerdings, dass das lokale Interface nicht bekannt ist. Mache ich einen Doppelklick, springe ich zum lokalen Interface ab - da wird es als gefunden.
Ich hab schon DEFERRED probiert, aber weiß nicht so recht, wo ich das einbauen könnte.

Re: Lokale Klassendefinition in globaler Klasse

Beitrag von Lukas Sanders (ForumUser / 29 / 6 / 18 ) »
Hallo,

es gibt zwei Arten, lokale Klassen bzw. Interfaces einzubinden, einmal über den offensichtlichen Menüpunkt "Lokale Definitionen/Implementierungen" und dann noch etwas versteckt über "Klassenrelevante lokale Definitionen". Das erreicht man im Menü über Springen -> Lokale Definitionen/Implementierungen -> Klassenrelevante lokale Definitionen - oder mit Strg+F5.

Wenn man unter den Klassenrelevanten Definitionen ein lokales Interface oder wenigstens den Definitionsteil einer lokalen Klasse anlegt, kann man diese auch in privaten Methoden als Parameter oder in Attributen als Typen verwenden. Der Implementierungsteil darf unter Lokale Definitionen/Implementierungen abgelegt sein.

Siehe folgendes Beispiel:

Klassenrelevante lokale Definitionen:

Code: Alles auswählen.

INTERFACE lif_test.
  METHODS: get_this, get_that.
ENDINTERFACE.

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    METHODS: do_something.
ENDCLASS.
Lokale Definitionen und Implementierungen:

Code: Alles auswählen.

CLASS lcl_test IMPLEMENTATION.
  METHOD do_something.
    MESSAGE 'Hallo Welt!' TYPE 'I'.
  ENDMETHOD.
ENDCLASS.
Globale Klasse:

Code: Alles auswählen.

CLASS zcl_test_nested DEFINITION  PUBLIC  FINAL CREATE PUBLIC .

  PUBLIC SECTION.
  PROTECTED SECTION.
  PRIVATE SECTION.

    DATA mo_if_test TYPE REF TO lif_test .
    DATA mo_cl_test TYPE REF TO lcl_test .

    METHODS get_object
      RETURNING
        VALUE(ro_object) TYPE REF TO lcl_test .
ENDCLASS.

CLASS zcl_test_nested IMPLEMENTATION.
  METHOD get_object.
    CREATE OBJECT ro_object.
  ENDMETHOD.
ENDCLASS.
So ist der Code Inspector zufrieden. Es klappt auch, wenn ich unter "Klassenrelevante [...]" nur die Typen bekannt mache und unter "Lokale [...]" vollständig definiere:

Code: Alles auswählen.

INTERFACE lif_test DEFERRED.
CLASS lcl_test DEFINITION DEFERRED.
Die Hilfe dazu, mit der eindeutigen Empfehlung, entsprechend zu verfahren:

https://help.sap.com/doc/abapdocu_752_i ... _guidl.htm

Ich verstehe die Hilfe so, dass der Teil unter "Klassenrelevante lokale Definitionen" letztlich beim Class-Pool auch im Definitionsteil der Klasse landet und somit für die nachfolgenden Methoden- und Attributdefinitionen der Private Section bekannt ist, während der unter "Lokale Definitionen/Implementierungen" definierte Teil erst im Implementierungsteil eingebunden wird.

Folgende Benutzer bedankten sich beim Autor Lukas Sanders für den Beitrag (Insgesamt 4):
ewxblack_adeptmsfoxIHe



Re: Lokale Klassendefinition in globaler Klasse

Beitrag von msfox (Specialist / 153 / 31 / 23 ) »
Lukas Sanders hat geschrieben:
15.04.2021 09:59
Klassenrelevante lokale Definitionen:
Das war die Schlüsselstelle. Jetzt weiß ich auch, wofür das so getrennt wird.
Danke...

Seite 1 von 1

Aktuelle Forenbeiträge

SmartForms show table...
vor 4 Tagen von Lucyalison 2 / 2260
Wie groß ist mein DynPro?
vor 4 Tagen von JanR gelöst 3 / 1135

Vergleichbare Themen

Lokale Klasse autom. in globale Klasse ändern
von JohnLocklay » 09.01.2019 09:10
wie kann ich in globaler klasse Datenbanktabelle benutzen?
von Jinn » 18.04.2004 12:17
Lokale Klasse importieren
von ewx » 16.04.2013 19:33
Lokale Klasse in zwei Dynpros
von Aba » 15.02.2018 16:43
Können lokale Klasse von Globalen erben?
von gs3rr4 » 24.04.2017 13:36