Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang? (https://www.delphipraxis.net/180942-gleichnamige-helfer-klassen-interface-abschnitt-hat-vorrang.html)

Der schöne Günther 2. Jul 2014 09:44

Delphi-Version: XE5

Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Gegeben sei:

Delphi-Quellcode:
unit Unit1;

interface
   uses System.SysUtils;                // Enthält ebenfalls einen TGUIDHelper
   procedure someProc(); forward;

   var myGUID: TGUID;

implementation
   uses Spring.Helpers;

   procedure someProc();
   begin
      if myGUID.IsEmpty then;
   end;

end.
Der TGUIDHelper aus
Delphi-Quellcode:
Spring.Helpers
hat eine Property
Delphi-Quellcode:
IsEmpty
, der aus
Delphi-Quellcode:
System.SysUtils
nicht. Die Code-Vervollständigung schlägt die Benutzung von
Delphi-Quellcode:
IsEmpty
vor. Beim Kompilieren aber wird gesagt
Code:
[dcc32 Fehler] Unit1.pas(15): E2003 Undeklarierter Bezeichner: 'IsEmpty'
[dcc32 Fataler Fehler] Project1.dpr(9): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Ich habe also zwei
Delphi-Quellcode:
record helper for System.TGUID
: Einmal den aus
Delphi-Quellcode:
System.SysUtils
und einmal aus, beispielhaft,
Delphi-Quellcode:
Spring.Helpers
. Ich hätte erwartet dass der aus
Delphi-Quellcode:
Spring.Helpers
genommen wird, da dieser im
Delphi-Quellcode:
implementation
-Abschnitt importiert wird. Anscheinend ist dem nicht so.

Ob das so gewollt ist?
Habe ich etwas an der Delphi-Philosophie falsch verstanden? Weil sonst haben doch eigentlich immer später importierte Units und immer "implementation nach Interface" Vorrang...

DeddyH 2. Jul 2014 10:07

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Und wenn Du die Variablen-Deklaration auch in den implementation-Abschnitt verschiebst? Ich bin nicht sonderlich bewandert in Helpern, könnte mir aber vorstellen, dass das so klappt.

Der schöne Günther 2. Jul 2014 10:13

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Tatsächlich, im Beispiel oben macht das einen Unterschied- Dann nimmt er den "richtigen" Helper.

Aber im echten Fall war es ein geschütztes Feld einer Klasse. Keine globale Variable. Die bekomme ich aus dem interface-Abschnitt ja nicht heraus :wink:

himitsu 2. Jul 2014 10:31

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Grundsätzlich würde ich eh immer empfehlen möglichst alle Uses ausschließlich im Interface zu deklarieren.
Da kommt es dann auch nur noch auf die Reihenfolge drauf an, was letzendlich verwendet wird.
Und vorallem ist ausschließlich dort die Initialisierungsreihenfolge der Units richtig gegeben.
In die Implementation kommen bei mir ausschließlich Units, welche aufgrund von Kreuzreferenzen dort hin müsssen.


Außerdem halte ich es immernoch für einen grauenhaften Bug, daß Helper-Klassen nicht überladen werden, also daß immer nur ein Helper gleichzeitig pro Klasse/Typ aktiv ist. :wall:

Und ja, es wäre toll, wenn Compiler, Code-Insight und Error-Insight gleich arbeiten würden.

Stevie 2. Jul 2014 11:41

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1264065)
Tatsächlich, im Beispiel oben macht das einen Unterschied- Dann nimmt er den "richtigen" Helper.

Aber im echten Fall war es ein geschütztes Feld einer Klasse. Keine globale Variable. Die bekomme ich aus dem interface-Abschnitt ja nicht heraus :wink:

In dem Fall solltest du die Spring.Helpers unit in das interface uses aber nach der SysUtils setzen.
Wusste ich aber auch noch nicht, dass es bei Helpers eine Rolle spielt ob die uses und das geholfene (:mrgreen:) Symbol im gleichen Bereich stehen

Der schöne Günther 2. Jul 2014 12:55

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Aber wir sind uns doch alle (drei Leute immerhin) einig, dass das so eigentlich nicht sein sollte, oder? Es sollte immer die Helferklasse der "letzten" Unit zum Einsatz kommen. Steckt im
Delphi-Quellcode:
interface
-Teil schon eine, überschreibt die im
Delphi-Quellcode:
implementation
-Teil diese aber nicht. Aber sie sollte es.

Ist bei anderen Typen ja auch so.

Stevie 2. Jul 2014 13:16

AW: Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1264104)
Aber wir sind uns doch alle (drei Leute immerhin) einig, dass das so eigentlich nicht sein sollte, oder? Es sollte immer die Helferklasse der "letzten" Unit zum Einsatz kommen. Steckt im
Delphi-Quellcode:
interface
-Teil schon eine, überschreibt die im
Delphi-Quellcode:
implementation
-Teil diese aber nicht. Aber sie sollte es.

Ist bei anderen Typen ja auch so.

Es wäre zumindest ein konsistentes Verhalten. Wobei ich es natürlich begrüßen würde, wenn Helper sich nicht gegenseitig verdecken würden (zumindest nicht, wenn deren Member nicht auch noch gleich heißen).

Aber mit der Verbesserung von Helpern geh ich Marco sowieso bei jeder sich bietenden Gelegenheit auf die Nerven :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz