Переопределение операторов в Delphi
Переопределение операторов позволяет задать собственную реализацию операций для отдельных классов или записей.
Новое определение оператора оформляется как class operator.
Пример определения оператора "равно" для TPoint:
TPoint = record ... public ... class operator Equal(const Lhs, Rhs : TPoint) : Boolean; ... end; class operator TPoint.Equal(const Lhs, Rhs: TPoint): Boolean; begin Result := (Lhs.X = Rhs.X) and (Lhs.Y = Rhs.Y); end;
Теперь возможно написать:
var A, B: TPoint; begin ... if A = B then ...
Операторы, которые можно переопределить представлены в таблице:
Оператор | Сигнатура | Символ |
---|---|---|
Унарный минус |
Negative(a: type) : resultType; |
- |
Унарный плюс |
Positive(a: type): resultType; |
+ |
Инкремент |
Inc(a: type) : resultType; |
Inc |
Декремент |
Dec(a: type): resultType |
Dec |
Логическое отрицание |
LogicalNot(a: type): resultType; |
not |
Отсечение |
Trunc(a: type): resultType; |
Trunc |
Округление |
Round(a: type): resultType; |
Round |
Вхождение в множество |
In(a: type; b: type) : Boolean; |
in |
Равно |
Equal(a: type; b: type) : Boolean; |
= |
Не равно |
NotEqual(a: type; b: type): Boolean; |
<> |
Больше |
GreaterThan(a: type; b: type) Boolean; |
> |
Больше или равно |
GreaterThanOrEqual(a: type; b: type): Boolean; |
>= |
Меньше |
LessThan(a: type; b: type): Boolean; |
< |
Меньше или равно |
LessThanOrEqual(a: type; b: type): Boolean; |
<= |
Сложение |
Add(a: type; b: type): resultType; |
+ |
Вычитание |
Subtract(a: type; b: type) : resultType; |
- |
Умножение |
Multiply(a: type; b: type) : resultType; |
* |
Деление |
Divide(a: type; b: type) : resultType; |
/ |
Целочисленное деление |
IntDivide(a: type; b: type): resultType; |
div |
Остаток |
Modulus(a: type; b: type): resultType; |
mod |
Сдвиг влево |
LeftShift(a: type; b: type): resultType; |
shl |
Сдвиг вправо |
RightShift(a: type; b: type): resultType; |
shr |
Логическое И |
LogicalAnd(a: type; b: type): resultType; |
and |
Логическое ИЛИ |
LogicalOr(a: type; b: type): resultType; |
or |
Исключающее ИЛИ |
LogicalXor(a: type; b: type): resultType; |
xor |
Побитовое И |
BitwiseAnd(a: type; b: type): resultType; |
and |
Побитовое ИЛИ |
BitwiseOr(a: type; b: type): resultType; |
or |
Побитовый XOR |
BitwiseXor(a: type; b: type): resultType; |
xor |
Кроме того, можно переопределить операции приведения типов:
// Преобразование из другого типа в наш. class operator TPoint.Implicit(Value: TSmallPoint): TPoint; begin Result.x := Value.x; Result.y := Value.y; end; // Преобразование из нашего типа в другой. class operator TPoint.Explicit(Value: TPoint): TSmallPoint; begin ... end;