Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum ist 'nil' einem TObject ähnlicher als einem IInterface? (https://www.delphipraxis.net/181121-warum-ist-nil-einem-tobject-aehnlicher-als-einem-iinterface.html)

Der schöne Günther 17. Jul 2014 10:46

Delphi-Version: XE5

Warum ist 'nil' einem TObject ähnlicher als einem IInterface?
 
Gut, man muss einmal drüber stolpern und weiß es dann. Aber steht das irgendwo geschrieben, dass es so ist? Oder gibt es vielleicht sogar einen Grund?

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

procedure someProc(param: IInterface); overload;
begin
   //
end;


procedure someProc(param: TObject); overload;
begin
   //
end;


begin
   someProc(nil); // er springt in someProc(const param: TObject);
   readln;
end.
Immerhin kann man sich darüber stören dass das nicht mit der IDE-Vorschau ("Code Insight"?) übereinstimmt, dass beispielsweise die IInterface-Version fett dargestellt wird, aber in Wirklichkeit die TObject-Version aufgerufen wird.

Uwe Raabe 17. Jul 2014 11:04

AW: Warum ist 'nil' einem TObject ähnlicher als einem IInterface?
 
Code Insight nimmt die erste Deklaration, die passt. Wenn du die beiden Prozeduren in anderer Reihenfolge deklarierst, springt er bei Ctrl-Click auch auf die richtige.

Stevie 17. Jul 2014 12:56

AW: Warum ist 'nil' einem TObject ähnlicher als einem IInterface?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1265755)
Aber steht das irgendwo geschrieben, dass es so ist? Oder gibt es vielleicht sogar einen Grund?

Unter Prozeduren und Funktionen überladen steht:

Zitat:

Zitat von DocWiki
Wenn die Eindeutigkeit gewährleistet ist, ruft der Compiler in diesen Fällen die Routine auf, deren Parametertyp für den Wertebereich der tatsächlich übergebenen Parameter mindestens erforderlich ist.

Ok, bei ShortInt oder Integer ist das relativ klar, wenn ich 24 habe, dann passt das schon in ShortInt. Bei 246 nicht mehr und er nimmt Integer.

Bei nil ist die Reihenfolge ein bisschen wirr und zwar wie folgt (durch Testen rausgefunden ;)):

typisierter Pointer (E2251 bei zwei unterschiedlichen)
untypisierter Pointer
TObject Nachfahre (E2251 bei zwei unterschiedlichen)
TObject
IInterface Nachfahre (E2251 bei zwei unterschiedlichen)
IInterface
Klassenreferenz (E2251 bei zwei unterschiedlichen)

himitsu 17. Jul 2014 13:43

AW: Warum ist 'nil' einem TObject ähnlicher als einem IInterface?
 
Du kannst ja dennoch bestimmen wo er rein soll.
Delphi-Quellcode:
someProc(IInterface(nil));


Und sowas geht auch.
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

procedure someProc(param: IInterface=nil); overload;
begin
   //
end;


procedure someProc(param: TObject); overload;
begin
   //
end;


begin
   someProc;
   readln;
end.
Aber ansonsten sollte man eigentlich wissen, daß Delphi (fast) immer die letzte "passende" Deklaration verwendet, also die Erste (von unten/hinten), welche es im aktuellen Skope findet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 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