Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

Logik von überladenen Operatoren ? - Grundsatzfrage

  Alt 14. Jun 2006, 18:18
Ich bin gerade bischen am spielen mit den neuen coolen Features von überladenen Operatoren von Delphi2006

Ich möchte folgenen Aufruf starten:


Delphi-Quellcode:
var
  st : String;
  IBZeit : TIBZeit;

begin

IBZeit := now;
st := IBZEit;
showmessage(st);

st := IBZEit + '5min';
showmessage(st);


end;
jetzt ist es doch in der Tat so, dass er erstaunlicherweise zu der Zeit die 5 Minuten hinzuaddiert. (schonmal cool)
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;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat