Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi was ist eine expicite Typumwandlung ? (https://www.delphipraxis.net/71400-ist-eine-expicite-typumwandlung.html)

stoxx 14. Jun 2006 16:20


was ist eine expicite Typumwandlung ?
 
Hallo, bin gerade am testen mit den class operatoren:
Funktioniert soweit gut, aber für was braucht man eine explicite Typumwandlung und was macht man damit ?
Vielen Dank !

Delphi-Quellcode:
  IBZeit : TIBZeit;
  crlf : STring;

begin

crlf := #13#10;
IBZeit:= now;

st := IBZeit +  crlf;
st := st + DateTimeToStr(IBZeit) + crlf;

showmessage(st);

Delphi-Quellcode:
//==============================================================================
type

TIBZeit = record
strict private
    Value : TDateTime; // am genauesten // unix Zeit ist ja nur bis auf eine Sekunde auflösend (Sekunden seit 1970)
public
    class operator implicit(UnixTime : Int64) : TIBZeit;
    class operator implicit(Zeit : TDateTime) : TIBZEit;

    class operator implicit(Self : TIBZeit) : String;
    class operator implicit(Self : TIBZeit) : TDateTime;

    class operator explicit(Self : TIBZeit) : String; // unklar
end;



implementation
//==============================================================================

class operator TIBZeit.implicit(UnixTime : Int64) : TIBZEIT;
begin
 result.Value := UnixToDateTime(UnixTime);
end; // implicit
//==============================================================================
class operator TIBZeit.implicit(Zeit : TDateTime) : TIBZeit;
begin
 result.value := Zeit;
end; // implicit


//==============================================================================

class operator TIBZEit.implicit(Self : TIBZeit) : String;
var   formatString : STring;
begin
   formatString := 'yyyymmdd hh:nn:ss';
   result := FormatDateTime(formatString, self.value) + ' CET';
end;

//==============================================================================

class operator TIBZEit.implicit(Self : TIBZeit) : TDateTime;
begin
  result := self.Value;
end;

//==============================================================================

class operator TIBZeit.explicit(self : TIBZeit): STring;
var   formatString : STring;
begin
 // für was nehm ich das ?
end;

//==============================================================================

Dax 14. Jun 2006 16:25

Re: was ist eine expicite Typumwandlung ?
 
Eine implizite Typumwandlung von Integer zu String ermöglich sowas:
Delphi-Quellcode:
var i: Integer; s: string;

s := i;
Das ist intuitiv, man denkt sich sofort, "Ah, der schreibt mir die Zahl in den String."

Explizite sind anders. Sie erlauben zwar auch Umwandlungen in andere Typen, aber nicht durch alleinige Zuweisung, du musst noch casten!
Delphi-Quellcode:
var i: Integer; s: string;

s := string(i);

shmia 14. Jun 2006 16:29

Re: was ist eine expicite Typumwandlung ?
 
Delphi-Quellcode:
// implizite Typumwandlung
// Compiler müsste hier eigentlich einen Fehler melden
ShowMessage(IBZeit);

// explizite Typumwandlung
// ich sag dem Compiler mit "as" wie er umwandln soll
// er ist beruhigt und findet auch die passende klassenfunktion
ShowMessage(IBZeit as string);

stoxx 14. Jun 2006 16:29

Re: was ist eine expicite Typumwandlung ?
 
hmm ... ok ... *überleg* .. klar ...
aber ich bekomm es noch nicht ganz hin, was mach ich mit dem class Operator explicit bei Überladen von Operatoren wie in meinem Beispiel ?

stoxx 14. Jun 2006 16:34

Re: was ist eine expicite Typumwandlung ?
 
Zitat:

Zitat von shmia
Delphi-Quellcode:
// implizite Typumwandlung
// Compiler müsste hier eigentlich einen Fehler melden
ShowMessage(IBZeit);

// explizite Typumwandlung
// ich sag dem Compiler mit "as" wie er umwandln soll
// er ist beruhigt und findet auch die passende klassenfunktion
ShowMessage(IBZeit as string);


Hmm .. irgendwie stimmt das nicht;

Showmessage(IBZeit) funktioniert, und er ruft den impliciten Class Operator auf (und meldet auch keinen Fehler, funktioniert ja)

und Showmessage(IBZEit as String) funktioniert bei records nicht ..... hmmm

Khabarakh 14. Jun 2006 16:44

Re: was ist eine expicite Typumwandlung ?
 
Dann eben mit einem harten Typecast wie in Dax' Beispiel.
Aber ein impliziter und ein expliziter Operator mit der gleichen Signatur wie in deinem Beispiel macht wenig Sinn.

Grundsätzlich sollte man explizite Casts immer dann einsetzen, wenn entweder ein Informationsverlust stattfinden könnte (z.B. Int zu Byte, woran sich aber Delphi nicht hält :stupid: ) oder der Cast fehlschlagen könnte (um Dax' Beispiel aufzugreifen: Jeder Integer lässt sich in einen String konvertieren, aber nicht unbedingt umgekehrt).

Sharky 14. Jun 2006 16:46

Re: was ist eine expicite Typumwandlung ?
 
Zitat:

Zitat von Khabarakh
.... wenn entweder ein Informationsverlust stattfinden könnte ....

:shock: Also wenn ein Inforamtionverlust stattfinden kann möchte ich kein Typecast in meinem Code sehen.

stoxx 14. Jun 2006 16:49

Re: was ist eine expicite Typumwandlung ?
 
ah, ich habs jetzt, danke !! ;-)

der Unterschied ist einfach, dass ich das so aufrufen muss:

Delphi-Quellcode:
i := Integer(IBZeit);
showmessage(InttoStr(i));
und nich so aufrufen kann:

Delphi-Quellcode:
i := IBZeit
Delphi-Quellcode:
class operator TIBZeit.explicit(self : TIBZeit): Int64;
begin
 result := 21343243;
end;

Khabarakh 14. Jun 2006 17:19

Re: was ist eine expicite Typumwandlung ?
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von Khabarakh
.... wenn entweder ein Informationsverlust stattfinden könnte ....

:shock: Also wenn ein Inforamtionverlust stattfinden kann möchte ich kein Typecast in meinem Code sehen.

Und wenn man einfach nur das unterste Byte eines Integers benötigt? Oder weiß, dass der Wert im Byte-Bereich liegt?
Der Compiler weiß ja nicht, ob es einen Informationsverlust geben wird oder er auch beabsichtigt ist. Deshalb warnt er vor diesem könnte mit einem expliziten Cast.

@stoxx: Der Unterschied ist einfach, dass dich der Compiler vor den zwei o.g. Gründen warnen will, er will dich ja nicht sinnlos mit Schreibarbeit quälen ;) .

[add]Ein dritter Grund: Bytegleiche, aber sinnverändernde Casts wie Pointer -> Integer oder Double -> Int64.[/add]

stoxx 14. Jun 2006 17:43

Re: was ist eine expicite Typumwandlung ?
 
mal noch eine blöde Frage, (oder soll ich einen neuen Thread aufmachen)


Delphi-Quellcode:
var s : String;
    Time : TDateTime;

in dem obigen Beispiel kann ich zwar

 s := IBZeit; zuweisen

aber NICHT

Time := IBZEIT;
kapier das nicht, obwohl beide definiert sind

Delphi-Quellcode:
class operator TIBZEit.implicit(Self : TIBZeit) : String;
var   formatString : STring;
begin
   formatString := 'yyyymmdd hh:nn:ss';
   result := FormatDateTime(formatString, self.value) + ' CET';
end;

//==============================================================================
class operator TIBZEit.implicit(Self : TIBZeit) : TDateTime;
begin
  result := self.Value;
end;

was hab ich da jetzt falsch gemacht ??
DAnke !


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