#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
Комментариев нет:
Отправить комментарий