Совмещение знаков операций (operator overloading)
В языках подобных Паскалю знак операции "+" - совмещен.
Действительно, он может использоваться для сложения целых и вещественных чисел, и даже строк.
Таким образом, очевидно что этот знак операции используется для представления кода который выполняет абсолютно разные действия.
Ада разрешает программистам выполнять совмещение предопределенных знаков операций с их собственным кодом.
Следует заметить, в Аде, действие выполняемое знаком операции, реализуется путем вызова функции именем которой является знак операции заключенный в двойные кавычки.
При этом, для обеспечения корректной работы механизма совмещения знаков операций, функция, которая реализует действие знака операции, должна соответствовать обычному требованию механизма совмещения подпрограмм Ады: она должна быть различима, то есть, ее профиль должен быть уникальным.
В некоторых случаях, проблему двусмысленности знака операции можно преодолеть непосредственно специфицируя имя пакета (рассматривается далее).
Кроме того, к функциям которые реализуют действия знаков операций предъявляется дополнительное требование: они не могут быть выделены в самостоятельно компилируемые модули, а должны содержаться в другом модуле, таком как процедура, функция или пакет.
Рассмотрим простой пример в котором мы хотим предусмотреть возможность сложения двух векторов:
procedure Add_Demo is
type Vector is array (Positive range <>) of Integer; A : Vector(1..5); B : Vector(1..5); C : Vector(1..5); function "+"(Left, Right : Vector) return Vector is Result : Vector(Left'First..Left'Last); Offset : constant Natural := Right'First - 1; begin if Left'Length /= Right'Length then raise Program_Error; -- исключение, -- рассматриваются позже end if; for I in Left'Range loop Result(I) := Left(I) + Right(I - Offset); end loop; return Result; end "+"; begin A := (1, 2, 3, 4, 5); B := (1, 2, 3, 4, 5); C := A + B; end Add_Demo; |
В этом примере хорошо продемонстрированы многие ранее рассмотренные средства которые характерны для языка программирования Ада.