Fehler: Constructor wurde nicht definiert.

Getting started ... Alles für einen gelungenen Start.
5 Beiträge / Seite 1 von 1
5 Beiträge Seite 1 von 1

Fehler: Constructor wurde nicht definiert.

Beitrag von sapnup (ForumUser / 40 / 13 / 11 ) » 2. Apr 2019 12:07

Hallo zusammen,

ich habe in se24 eine abstrakte Klasse (MyAbstractClass) angelegt. In dieser Klasse ist u.a. ein Konstruktor implementiert. Die Klasse MyClass, ebenfalls in se24 angelegt, erbt von MyAbstractClass.

Nun habe ich irgendwo im Code sowas hier:

Code: Alles auswählen.

Data myObject type ref to MyClass.

create object myObject
exporting
fp1 = ap1.
*...usw usf
an der Stelle "create object myObject" nutze ich die Autoverfollständigung (strg+space) und erhalte auf diese Weise die Parameterliste des in MyAbstractClass defnierten und implementierten Konstruktors - daraus folgere ich, dass der Abap-Kompiler den Konstruktor von MyAbstractClass, wie von mir beabsichtigt, für die implementierende Klasse MyClass übernimmt.

Wenn ich an diese Stelle eine Codeprüfung (Strg+f2) durchführe, erhalte ich eine Fehlermeldung "Für MyClass wurde kein Constructor definiert". Und das obwohl die Autovervollständigung mir bei "create object myObject" die Parameterliste des Constructors geautovervollständigt hat. Zudem besitzt MyClass in SE24 sehr wohl einen Konstruktor - und zwar den in MyAbstractClass definierten.

Noch seltsamer ist, dass wenn ich die Fehlermeldung ignorierend meinen Code aktiviere und ausführe, alles fehlerfrei abläuft. An der Stelle "create object myObject" kann ich wunderbar in den in MyAbstractClass definierten Constructor rein debuggen, das Objekt wird korrekt angelegt und auch sonst gibt es keine Dumps oder unerwartetes Verhalten.

Warum bekomme ich die Fehlermeldung bei der Codeprüfung?


Re: Fehler: Constructor wurde nicht definiert.

Beitrag von sebter (ForumUser / 1 / 0 / 1 ) » 2. Apr 2019 16:10

Ich habe das Konstrukt einmal nachgebaut. Bei mir tritt dieses Phänomen nicht auf.
Hier mein minimales, lauffähiges Programm:

Code: Alles auswählen.

CLASS lcl_abstract DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS:
      constructor IMPORTING iv_num TYPE int8.

    PRIVATE SECTION.
      DATA:
            number TYPE int8.
ENDCLASS.

CLASS lcl_abstract IMPLEMENTATION.
  METHOD constructor.
    number = iv_num.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_konkret DEFINITION INHERITING FROM lcl_abstract.
  PUBLIC SECTION.
    METHODS:
      constructor IMPORTING iv_num TYPE int8.
ENDCLASS.

CLASS lcl_konkret IMPLEMENTATION.
  METHOD constructor.
    super->constructor( iv_num ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

DATA lr_number TYPE REF TO lcl_konkret.

CREATE OBJECT lr_number
  EXPORTING
    iv_num = 42.

Folgende Benutzer bedankten sich beim Autor sebter für den Beitrag:
sapnup


Re: Fehler: Constructor wurde nicht definiert.

Beitrag von SaskuAc (Specialist / 246 / 18 / 27 ) » 3. Apr 2019 06:21

Könntest du bitte die Klassendefinitionen mal posten? Dann können wir besser beurteilen, was hier schief läuft.

heißt das:
sapnup hat geschrieben: Zudem besitzt MyClass in SE24 sehr wohl einen Konstruktor - und zwar den in MyAbstractClass definierten.
,

dass du gar keine definition ( und dementsprechend keine implementierung ^^ ) des Konstruktors für MyClass angelegt hast? sondern diese dann implizit von MyAbstractClass übernimmst?

Wie gesagt, wäre gut, wenn du das Coding mal rein postest, dann können wir das besser nachvollziehen

Folgende Benutzer bedankten sich beim Autor SaskuAc für den Beitrag:
sapnup


Re: Fehler: Constructor wurde nicht definiert.

Beitrag von sapnup (ForumUser / 40 / 13 / 11 ) » 3. Apr 2019 16:15

@sebter
Ich habe gestern Abend dein Beispiel probiert und es lief bei mir ohne Fehlermeldungen. In Abänderung deines Beispiels habe ich in lcl_konkret die Konstruktordefinition- und Implementierung ausgesternt, also nicht explizit definiert und nicht explizit implementiert - es funktioniert aber auch. Dann habe ich dein Beispiel mit globalen Klassen in SE24 nachgebaut und auch da lief es ohne Probleme. Ich bin also weiter auf der Suche nach einem Weg mein Problem zu reproduzieren.

@SaskuAc
Könntest du bitte die Klassendefinitionen mal posten? Dann können wir besser beurteilen, was hier schief läuft.
Ne, leider nicht, aus verschiedenen Gründen.
heißt das:

sapnup hat geschrieben:
Zudem besitzt MyClass in SE24 sehr wohl einen Konstruktor - und zwar den in MyAbstractClass definierten.

,

dass du gar keine definition ( und dementsprechend keine implementierung ^^ ) des Konstruktors für MyClass angelegt hast? sondern diese dann implizit von MyAbstractClass übernimmst?
Genau das heiß es. Aber ich habe in meiner Problemklasse auch probiert einen selbst definierten und implementierten Konstruktor anzulegen. Das Problem bestand weiterhin.

Als nächstes versuche ich mal die betreffenden Klassen zu sichern, zu löschen und neu zusammen zu klicken. ... turn it off and on again ...
Sollte es das Problem nicht lösen werde ich versuchen das Problem zu reproduzieren und bei Erfolg poste ich hier den Code.

Ich danke euch beiden für euer Interesse.

Re: Fehler: Constructor wurde nicht definiert.

Beitrag von sapnup (ForumUser / 40 / 13 / 11 ) » 15. Apr 2019 16:20

Hallo sebter, SaskuAc und andere Interessierte,

hier mal die Codeauszüge zu meinem Problem.

Code: Alles auswählen.

*Abstrakte Klasse:
class Z_ABSTRACT_CLASS definition
  public
  create public .

public section.

  methods CONSTRUCTOR
    importing
      !PAR_EINS type STRING .
protected section.
private section.
ENDCLASS.



CLASS Z_ABSTRACT_CLASS IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Z_ABSTRACT_CLASS->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* | [--->] PAR_EINS                       TYPE        STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
method CONSTRUCTOR.

  BREAK-POINT.

endmethod.
ENDCLASS.

Code: Alles auswählen.

*Konkrete Klasse:
class Z_CONCRETE_CLASS definition
  public
  inheriting from Z_ABSTRACT_CLASS
  final
  create public .

public section.
protected section.
private section.
ENDCLASS.



CLASS Z_CONCRETE_CLASS IMPLEMENTATION.
ENDCLASS.

Code: Alles auswählen.

*Aufrufender Code:
data: myObject TYPE REF TO z_concrete_class.

CREATE OBJECT myobject
  EXPORTING
    par_eins = 'DerWinterNaht'.
  
Fazit:
Die Codeauszüge stellen die Klassenhierarchie dar die bei mir zu Problemen führte - an der Stelle "CREATE OBJECT" bekam ich die Fehlermeldung "Für myObject wurde kein Constructor definiert" (siehe Eingangspost für Details). Das Problem lässt sich nur dann Reproduzieren, wenn ich die bei mir betroffene Klasse (im Beispiel "z_concrete_class" genannt in SE24 oder SE80 lösche und unter dem selben Namen in SE24 neu anlege. Bei Versuchsbeispielen, wie den Codeauszügen am Anfang, tritt das Problem nicht auf. Es tritt auch nicht auf, wenn ich die problembehaftete Klasse lösche und eine neue Klasse mit einem geänderten Namen und sonst dem exakt selben Inhalt in SE24 anlege.

Beim Versuch dem Problem auf den Grund zu gehen habe ich folgendes festgestellt:
Beim Anlegen einer neuen Klasse in SE24 werde ich aufgefordert den Transportauftrag für diese Klasse festzulegen (oder die Klasse lokal anlzulegen). Lösche ich eine Klasse, welche einem Transportauftrag zugeordnet war und lege anschließend in SE24 eine neue Klasse mit dem Namen der eben gelöschten an, so werden ich nicht erneut nach einem Transportauftrag gefragt - die neu angelegte Klasse wird dem Transportauftrag der zuvor gelöschten Klasse zugeordnet.

Daraus folgere ich, dass beim löschen einer Klasse in SE24 oder SE80 nicht alle Details gelöscht werden. Ich vermute, dass eine ähnliche Mechanik auch für mein Ausgangsproblem verantwortlich ist. Da ich aber bereits mit einer kleinen Namensänderung das Problem umgehen konnte werde ich hier nicht weiter bohren.

Für mich geht das Problem jetzt zu den ABAP X-Akten. Falls aber jemand noch was wissen will, oder etwas zur Aufklärung beitragen kann, nur zu...

Seite 1 von 1

Aktuelle Forenbeiträge

FB
vor 6 Stunden von deejey 2 / 74
Kreditlimitprüfung Obligo
vor 13 Stunden von wreichelt 2 / 52
Business Partner Konzept
vor 20 Stunden von SAP_ENTWICKLER 1 / 94
Fortführen der Schleife
vor 20 Stunden von ichse18577 2 / 82

Unbeantwortete Forenbeiträge

Business Partner Konzept
vor 20 Stunden von SAP_ENTWICKLER 1 / 94
Auflösen MILL_OC - Auftragszusammenfassung
vor einer Woche von tofralu 1 / 82
Löschen von archivierten Drucklisten
vor einer Woche von Asaph 1 / 74