Страницы

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

воскресенье, 9 февраля 2020 г.

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

#delphi #перегрузка_операторов #delphi_xe


Можно ли перегрузить оператор для перечисляемого типа?
т.е. имеем например:

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)

    


Ответы

Ответ 1



Как уже сказано в ответе @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.

Ответ 2



Нельзя такого сделать. В десктопных версиях Delphi перегрузка операторов возможна только у записей: Operator Overloading (Delphi). Для мобильных версий (с ARC) перегрузка доступна так же и для классов: Class Operators in Delphi

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

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