![]() |
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; //============================================================================== |
Re: was ist eine expicite Typumwandlung ?
Eine implizite Typumwandlung von Integer zu String ermöglich sowas:
Delphi-Quellcode:
Das ist intuitiv, man denkt sich sofort, "Ah, der schreibt mir die Zahl in den String."
var i: Integer; s: string;
s := i; 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); |
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); |
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 ? |
Re: was ist eine expicite Typumwandlung ?
Zitat:
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 |
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). |
Re: was ist eine expicite Typumwandlung ?
Zitat:
|
Re: was ist eine expicite Typumwandlung ?
ah, ich habs jetzt, danke !! ;-)
der Unterschied ist einfach, dass ich das so aufrufen muss:
Delphi-Quellcode:
und nich so aufrufen kann:
i := Integer(IBZeit);
showmessage(InttoStr(i));
Delphi-Quellcode:
i := IBZeit
Delphi-Quellcode:
class operator TIBZeit.explicit(self : TIBZeit): Int64;
begin result := 21343243; end; |
Re: was ist eine expicite Typumwandlung ?
Zitat:
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] |
Re: was ist eine expicite Typumwandlung ?
mal noch eine blöde Frage, (oder soll ich einen neuen Thread aufmachen)
Delphi-Quellcode:
kapier das nicht, obwohl beide definiert sind
var s : String;
Time : TDateTime; in dem obigen Beispiel kann ich zwar s := IBZeit; zuweisen aber NICHT Time := IBZEIT;
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 06:25 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-2025 by Thomas Breitkreuz