Ich vermute mal bei TTranslatedString hat das was mit RTTI zu tun. Die Internationalization muss ja erkennen an welcher stelle Übersetzungen benötigt werden und an welcher nicht. So macht es z.B. keinen Sinn den FileName des OpenDialogs zu übersetzen ist ja unsinnig. Somit kann praktisch die Anwendung einfach mit RTTI durch alle Properties gehen die vom typen TTranslatedString sind, und für die i18n code ausführen, und alle String daten ignorieren.
Bei nicht Basistypen gibt das ganze noch einen größeren Vorteil, du kannst damit einen neuen typen erstellen die nicht mit dem original kompatibel sind. Beispiel:
Code: Alles auswählen
type
TVector = record
X, Y: Integer;
end;
TPosition = type TVector;
TSize = type TVector;
procedure Draw(Position: TPosition; Size: TSize);
begin
end;
var
pos: TPosition;
sz: TSize;
begin
Draw(sz, pos); // Error weil falschrum
Damit kann man sicherstellen das wenn man mehrere argumente des selben typs, aber mit unterschiedlicher Semantischer Bedeutung hat, diese vom Compiler checken zu lassen. Wie man oben sehen kann, wenn man ausversehen die reihenfolge der Parameter vertauscht meckert der Compiler.
Leider geht das nicht für Basisdatentypen, wäre äußerst nützlich sowas machen zu können:
Code: Alles auswählen
type
THost = type String;
TUser = type String;
TPassword = type String;
proceudre DataBaseLogin(AHost: THost; AUser: TUser; APassword: TPassword = '');
[...]
DatabaseLogin(DBUser, DBPass);
Da hier APassword den Default Wert '' hat, reicht es 2 parameter zu übergeben. Wenn jetzt von allen der typ String ist, bedeutet das die anwendung kompiliert indem einfach DBUser als Host übergeben wird, und DBPass als User, und das Passwort bleibt leer. Wenn das mit dem typing strikt checken würde hingegen, würde hier der Compiler meckern das DBUser kein gültiger THost ist.
Denn ich hatte es schon öfter das wenn man parameter einfach an funktionen weiter durreicht und dann mal was vergisst, ausversehen falschrum angibt, oder sich die funktionsdefinition geändert hat und jetzt ein neuer Parameter benötigt wird aber nicht alle Nutzungen angepasst wurden.
Es ist eigentlich komplett unsinnig das man alle arten von Text gleichbehandelt. Eine E-Mail Addresse hat andere semantische Eigenschaften als ein Passwort, was wieder anders ist als eine IP Addresse, was wiederum was komplett anderes ist als ein Pfad.
Dennoch benutzt alles den selben typen und ist damit gegeneinander austauschbar. Wir verlieren massive Vorteile die wir durch Typchecking an anderer stelle (wie Klassen oder Record typen) haben, weil wir für alles was Text ist string benutzen