В приложениях .NET в Delphi 2005 и 2006 можно перегружать операции, выполняемые с записями (структурами) и классами. Эта возможность доступна и в приложениях VCL .NET, и в приложениях Windows Forms. Так что в этих приложениях в реализации векторов имеет смысл использовать эту возможность.

Для перегрузки операций в объявления соответствующих типов помещаются объявления, начинающиеся спецификацией class operator. Вслед за этими словами следует имя перегружаемой операции, указывается список параметров и тип возвращаемого результата.

Приведенная ниже таблица содержит имена операций, допускающих перегрузку, и вид соответствующих объявлений.

Операция

Объявление

Неявное приведение типа

Implicit(a : type): resultType;

Явное приведение типа

Explicit(a: type): resultType;

Унарный минус "-"

Negative(a: type): resultType;

Унарный плюс " + "

Positive(a: type): resultType;

Инкремент Inc

Inc(a: type): resultType;

Декремент Dec

Dec(a: type): resultType;

Логическое отрицание not

LogicalNot(a: type): resultType

Порязрядное отрицание not

BitwiseNot(a: type): resultType;

Усечение Trunc

Trunc(a: type): resultType;

Округление Round

Round(a: type): resultType;

Эквивалентность =

Equal(a: type;
b: type): Boolean;
Неэквивалентность <>
NotEqual(a: type;
b: type): Boolean;
>
GreaterThan(a: type;
b: type): Boolean;

>=

GreaterThanOrEqual(a: type;
b: type): resultType;
<
LessThan(a: type;
b: type): resultType;

<=

LessThanOrEqual(a: type;
b: type): resultType;

+

Add(a: type;
b: type): resultType;

-

Subtract(a: type;
b: type): resultType;

*

Multiply(a: type;
b: type) : resultType;

/

Divide(a: type;
b: type) : resultType;

Целочисленное деление div

IntDivide(a: type;
b: type): resultType;

Остаток целочисленного

Modulus(a: type;
b: type): resultType;

деления mod

Сдвиг влево shl

ShiftLeft(a: type;
b: type): resultType;

Сдвиг вправо shr

ShiftRight(a: type;
b: type): resultType;

Логическое И and

LogicalAnd(a: type;
b: type): resultType;

Логическое ИЛИ ог

LogicalOr(a: type;
b: type): resultType;

Логическое исключающее

LogicalXor(a: type;
b: type): resultType;

ИЛИ хог

Поразрядное И and

BitwiseAnd(a: type;
b: type): resultType;

Поразрядное ИЛИ or

BitwiseOr(a: type;
b: type): resultType;

Поразрядное исключающее

BitwiseXor(a: type;
b: type): resultType;

ИЛИ хог

В объявлениях перегруженных бинарных операций параметр а - это левый операнд, a b - правый. Реализация перегруженных функции не должна изменять значения операндов. Она должна возвращать результат, соответствующий применению операции к ее операндам.

Если операция бинарная, типы а и b - разные и обеспечено неявное приведение этих типов другк другу, то может возникнуть неоднозначность в трактовке компилятором такой операции: то ли надо тип второго операнда приводить к первому, то ли тип первого приводить ко второму. Если имеется такая неоднозначность, надо принимать меры к ее ликвидации. Иногда при этом может помочь перегрузка только явного приведения типов, Объявления перегруженных операций включаются в объявление записи или класса, но указанные в таблице имена операций не входят в список элементов записи или класса. Использование перегрузки доступно только через символы операций. Например, если имеются переменные А1 и А2 типов, указанных в перегруженной операции Add, то эта операция вызывается неявно, когда пользователь записывает выражение А1+А2.


|Следующая страница ⇒

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Март
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс