Можно ли перегрузить оператор для перечисляемого типа?
т.е. имеем например:
Type
TAngle = (a0, a90, a180, a270);
Var
AngleA, AngleB, AngleC: TAngle;
AngleA := a90;
AngleB := a180;
AngleC := AngleA + AngleB; //a270
AngleC := a270 + AngleB; //a90
AngleC := AngleB + a180; //a0
По идее перегрузить бы оператор сложения, но это возможно только для записей, как я понимаю? Может можно запись через Implicit неявно приводить к этому перечисляемому типу? Но тогда это всё равно будет уже новый тип.
Вообще логика такая получается, пока сделал через функцию:
Result := TAngle((Ord(AngleA) + Ord(AngleB)) Mod 4)
Ответ
Как уже сказано в ответе @zed перегрузка доступна только для записей. Поэтому, если хочется, вы можете добавить соответствующую структуру, и работать с ней.
TAngleValue = (av0, av90, av180, av270);
TAngle = record
FValue : TAngleValue;
function getAngle():integer;
public
class operator Add(a, b: TAngle ):TAngle;
class operator Implicit(angle: TAngleValue):TAngle;
property Angle: integer read getAngle;
property Value: TAngleValue read FValue;
end;
перегрузив сложение и, для начала, неявное приведение
class operator TAngle.Add(a, b: TAngle): TAngle;
begin
result.FValue := TAngleValue( (byte(a.FValue) + byte(b.FValue)) mod 4);
end;
class operator TAngle.Implicit(angle: TAngleValue): TAngle;
begin
result.FValue := angle;
end;
function TAngle.getAngle(): integer;
begin
result := byte(FValue)*90;
end;
в итоге само манипулироввание значениями получится таким, как вы хотели
var a, b, c : TAngle;
begin
a := av90;
b := av180;
c := a + b + av90;
writeln( a.Angle, ' ', b.Angle, ' ', c.Angle);
readln;
end.
Комментариев нет:
Отправить комментарий