AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum ist 'nil' einem TObject ähnlicher als einem IInterface?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ist 'nil' einem TObject ähnlicher als einem IInterface?

Offene Frage von "himitsu"
Ein Thema von Der schöne Günther · begonnen am 17. Jul 2014 · letzter Beitrag vom 17. Jul 2014
Antwort Antwort
Der schöne Günther

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

Warum ist 'nil' einem TObject ähnlicher als einem IInterface?

  Alt 17. Jul 2014, 11:46
Delphi-Version: XE5
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 17. Jul 2014, 12:04
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

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

  Alt 17. Jul 2014, 13:56
Aber steht das irgendwo geschrieben, dass es so ist? Oder gibt es vielleicht sogar einen Grund?
Unter Prozeduren und Funktionen überladen steht:

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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Jul 2014 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 17. Jul 2014, 14:43
Du kannst ja dennoch bestimmen wo er rein soll.
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.
$2B or not $2B
  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:41 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