Добавить комментарий

Delphi

Переопределение операторов в 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;

 

 

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.