Страницы

Поиск по вопросам

вторник, 16 апреля 2019 г.

Перегрузка операторов перечисляемого типа в Delphi

Можно ли перегрузить оператор для перечисляемого типа? т.е. имеем например:
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.

Комментариев нет:

Отправить комментарий