AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?
Thema durchsuchen
Ansicht
Themen-Optionen

Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?

Ein Thema von Der schöne Günther · begonnen am 2. Jul 2014 · letzter Beitrag vom 2. Jul 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Gleichnamige Helfer-Klassen: Interface-Abschnitt hat Vorrang?

  Alt 2. Jul 2014, 10:44
Delphi-Version: XE5
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 Spring.Helpers hat eine Property IsEmpty , der aus System.SysUtils nicht. Die Code-Vervollständigung schlägt die Benutzung von 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 record helper for System.TGUID : Einmal den aus System.SysUtils und einmal aus, beispielhaft, Spring.Helpers . Ich hätte erwartet dass der aus Spring.Helpers genommen wird, da dieser im 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...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 2. Jul 2014, 11:07
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 2. Jul 2014, 11:13
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 2. Jul 2014, 11:31
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.

Und ja, es wäre toll, wenn Compiler, Code-Insight und Error-Insight gleich arbeiten würden.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

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

  Alt 2. Jul 2014, 12:41
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
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 () Symbol im gleichen Bereich stehen
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 2. Jul 2014, 13:55
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 interface -Teil schon eine, überschreibt die im implementation -Teil diese aber nicht. Aber sie sollte es.

Ist bei anderen Typen ja auch so.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

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

  Alt 2. Jul 2014, 14:16
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 interface -Teil schon eine, überschreibt die im 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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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