![]() |
Logik von überladenen Operatoren ? - Grundsatzfrage
Ich bin gerade bischen am spielen mit den neuen coolen Features von überladenen Operatoren von Delphi2006
Ich möchte folgenen Aufruf starten:
Delphi-Quellcode:
jetzt ist es doch in der Tat so, dass er erstaunlicherweise zu der Zeit die 5 Minuten hinzuaddiert. (schonmal cool)
var
st : String; IBZeit : TIBZeit; begin IBZeit := now; st := IBZEit; showmessage(st); st := IBZEit + '5min'; showmessage(st); end; Er wandelt IBZeit sozusagen in TDateTime um. und den String auch in die IBZeit. Woher weiß ich das ? Man hätte ja genauso annehmen können, dass IBZeit in einen String umgewandelt wrd und dann der String '5min' angehangen wird. Die Logik verstehe ich nicht so ganz. wie kommt das ?
Delphi-Quellcode:
//==============================================================================
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(Value : String) : TIBZeit; class operator implicit(Self : TIBZeit) : String; class operator implicit(Self : TIBZeit) : TDateTime; class operator add(Zeit1, Zeit2 : TIBZeit) : TIBZeit; 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(Value : String) : TIBZeit; var Stunden,Minuten, Sekunden, MilliSekunden : Word; begin result.Value := 0; Stunden := 0; Minuten := 0; Sekunden := 0; Millisekunden := 0; Value := uppercase(Value); if pos('MIN', Value) > 0 then begin Value := StringReplace(Value,'MIN','', [rfReplaceAll]); Minuten := StrToInt(Value); result.Value := encodeTime(Stunden,Minuten,Sekunden,Millisekunden); end; 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.add(Zeit1, Zeit2 : TIBZeit) : TIBZEit; begin result := Zeit1.Value + Zeit2.Value; end; |
Re: Logik von überladenen Operatoren ? - Grundsatzfrage
In dem Fall ist der Compiler wohl überfragt (und sollte eigentlich warnen bzw nen Fehler werfen weil unklar is was er denn nun tun soll), und nimmt einfach die erste deklarierte Umwandlung, um danach die beiden Zeiten zu addieren. Mit
Delphi-Quellcode:
sollte es eigentlich funktionieren.. :gruebel:
st := string(IBZeit) + '5min';
|
Re: Logik von überladenen Operatoren ? - Grundsatzfrage
Ich glaube an den Comiler ...
Er weis ja, dass ein TIBTime (oder so) rauskommen soll, der eine Operand ists ja schon, und den andern wandelt er halt um ... :stupid: |
Re: Logik von überladenen Operatoren ? - Grundsatzfrage
Zitat:
;-) naja .. wird schon schief gehen |
Re: Logik von überladenen Operatoren ? - Grundsatzfrage
Zitat:
Ich kann das Verhalten nur für den CSC erklären, aber wenigstens würde er im oberen Beispiel das Gleiche wie der Delphi-Compiler ausspucken. Könnte also gut sein, dass die Borländer die Überladungsauflösung bei ihrem Compiler gleich oder wenigstens ähnlich gestaltet haben. Zitat:
Im Zweifelsfalle also lieber eine explizite Umwandlung verwenden ;) . |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 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