Alternativer Vorschlag ohne Vererbung:
Delphi-Quellcode:
type
TSafeInteger = record
strict private
FValue: Integer;
public
class operator Implicit(A: TSafeInteger): Integer; overload;
class operator Implicit(A: Integer): TSafeInteger; overload;
end;
class operator TSafeInteger.Implicit(A: TSafeInteger): Integer;
begin
Result := A.FValue;
end;
class operator TSafeInteger.Implicit(A: Integer): TSafeInteger;
begin
if A < 0 then
Result.FValue := 0
else
Result.FValue := A;
end;
type
TTest = class
strict private
fID: TSafeInteger;
function GetID: Integer;
procedure SetID(value: integer);
private
procedure doWork;
public
property ID:Integer read GetID write SetID;
end;
procedure TTest.doWork;
begin
fID := -10; // hier wird intern eine 0 geschrieben!
// aber das geht halt nicht:
// fID.FValue := -10;
end;
function TTest.GetID: Integer;
begin
result := fID;
end;
procedure TTest.SetID(value: integer);
begin
fID := value;
end;