Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktionen überladen (https://www.delphipraxis.net/114437-funktionen-ueberladen.html)

himitsu 25. Mai 2008 16:04


Funktionen überladen
 
ja, ich weiß schon wie das geht,

aber es funktioniert ja leider nur Unit-intern.


Gibt es 'ne Möglichkeit auch Unitübergreifend zu überladen?
(Normalerweise wird in soeinem Fall ja überschrieben :cry: )


ein Beispiel:
ich definiere mir eine IntToStr und wenn jetzt die Unit, wo ich dieses definiert habe, nach der SysUtils eingebunden ist, dann wird ja nur noch meine Definition verwendet und nicht mehr die aus der SysUtils, selbst wenn der verwendete Parametertype auf die Version in der SysUtils paßt ... in soeinem Fall meckert der Kompiler einfach nur und meint was von inkompatiblen Typen :wall:




Der Kompiler sucht doch eh schon rückwärts in allen Units, bis er eine Funktion mit passendem Namen findet,
nur hört er dann in dieser Unit auf mit Suchen.

Es wär also schön, wenn man ihn dazubringen könnte auch noch weiterzusuchen, wenn in dieser Unit nichts mit passenden Parametern zu finden ist.

grenzgaenger 25. Mai 2008 16:11

Re: Funktionen überladen
 
das problem ist, dass sie in unterschiedlichen namespaces liegen.

was du machen könntest, wäre, die funktionen komplett in deiner unit zu definieren und bei der anderen, welche du in der anderen unit überschreibst, diese ebenfalls zu deklarieren und sie im anschluss aufzurufen... so in etwa

Delphi-Quellcode:
myUnit
interface
function inttostr(aShort: byte): string; overload;
function inttostr(aLongint: longint): string; overload;
implementation
function inttostr(aShort: byte): string;
begin
...
end;
function inttostr(aLongint: longint): string;
begin
 result := sysutils.inttostr(aLongint);
end;
ungetestet, kannst ja mal checken...

himitsu 25. Mai 2008 16:20

Re: Funktionen überladen
 
An sowas in dieser Richtung hate ich zwar auch schon gedacht.

(bei eigenen Funktionen hab is schon einige Male per ASM-Jump gelöst ... erspart einem die Parameterübergabe und den zusätzlichen Rückprung)


nur bei sowas wie Dec und Inc ist es doch nicht sonderlich schön, da hierdurch ein wesendlicher Nachteil entsteht.
(vorher sehr optimaler Inlinecode und danach bestimmt mindestens ein Funktionsaufruf).


Grund: ich wöllte für meine BigInt Delphis Integer-Funktionen überladen.

Daniel 25. Mai 2008 16:24

Re: Funktionen überladen
 
Ist das nicht das, was Andreas (aka jbg) in einigen seiner Units macht: Sich woanders "reinschummeln"? (Ist jetzt nicht böse gemeint ;-) )

Ich meine, dass Du dieses Prinzip zum Beispiel in der von Andreas veröffentlichten RTLVCLOptimize.pas - Unit umgesetzt finden müsstest. Ein Blick ist diese Unit jedenfalls Wert.

grenzgaenger 25. Mai 2008 16:28

Re: Funktionen überladen
 
was hälst du von, hier mit class operators zu arbeiten? entweder das ganze als klasse aufzubauen, oder als record (ab D2006)?

dann gäbs so etwas

mydata.toString oder myData.inc

himitsu 25. Mai 2008 17:32

Re: Funktionen überladen
 
@Daniel:
hab schon reingeschaut :angel:

Die RTLVCLOptimize.pas ersetzt delphieigene Funktionen durch Bessere.

Ich möchte nur erweitern, aber die schon vorhandenen Funktionen sollen dennoch weiterhin "leicht" nutzbar sein. (ohne Angabe des anderen Namespace)

Am Liebsten wäre es mir, wenn der Compiler direkt die richtigen Funktionen anspringen läßt
und ich nicht erst über 'ne eigene Dummy-Funktion umleiten muß.


@grenzgaenger:
sowas wie myData.inc; hab ich schon, aber ich wollte gern auch noch die Standardfunktion Inc(myData); nutzbar machen :stupid:


[add]
Zitat:

{$IRGENDWAS 'System.Inc' as 'Inc'}
irgendwas seitens Delphi, womit man z.B. fremde Funktionen in den eigenen Nameppace holen könnte, wäre schon toll? :spin:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.

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