Читайте также:
|
|
Перегруженные операции вводятся как объявления знаков операций. Синтаксис объявления имеет следующий вид:
OperatorDeclaration = operator [ OpModifiers ] OpSymbol [ FormalParameters ] ";" OperatorBody ";".
OperatorBody = Declarations BlockStatement OpSymbol.
OpModifiers = "{" ident { "," ident } [ "," Priority ] "}".
Priority = ConstExpression.
OpSymbol = String. // 1-, 2- или 3-литерная строка; множество возможных символов ограничено
Пример:
operator '+' (x1, x2: Complex): Complex;
var res: Complex;
begin
res.re:= x1.re + x2.re;
res.im:= x1.im + x2.im;
return res
end '+';
Для перегруженных знаков операций количество параметров в объявлении знака операции должно быть тем же, что и для предопределенной операции с тем же знаком. Для объявления нового знака операций количество параметров в объявлении знака операции должно быть равным одному или двум в зависимости от того, является ли операция унарной или бинарной.
В определенном пользователем знаке операции для присваивания должно быть два параметра, первый из которых должен подставляться по ссылке.
Имеется возможность определять перегрузки и новые операции только в module, но не в object или definition. Причина – должна быть полная возможность статического разрешения перегрузки во время компиляции. Другая причина – ясно разделить две концепции: объекты, реализующие интерфейсы (определения) и абстрактные типы данных с ассоциированными операциями.
Объявления знаков операций можно сделать видимыми извне модуля, где они объявлены. В этом случае, законно использовать указанные знаки операций в нормальных выражениях наряду с предопределенными знаками операций в единицах, импортирующих данный модуль. Компилятор ответственен за выбор правильной версии знака операций в каждом случае.
Допускается определять знаки операций в некотором модуле для расширения абстрактного типа данных. Эти знаки операций должны быть определены в терминах операций, уже определенных в модуле, где объявлен абстрактный тип данных.
Обычно, все импортируемые вхождения должны квалифицироваться именами импортируемых единиц. Это также возможно, но не требуется для знаков операций. Например, имеется два законных способа использования “новых сложений” для операндов некоторого типа T.
module M;
type T {public}= …;
operator {public}"+" (a, b: T): T; begin …end "+";
end M.
object Obj;
import M;
var x, y: T;
begin
x:= x + y; (* подобно обычному выражению *)
x:= x M."+" y; (* полностью квалифицрованный *)
end Obj.
Процедура знака операции не может быть вызвана как обычная функция:
x:= M."+"(x, y); (* не законно; должна использоваться нотация выражения *)
Дата добавления: 2015-01-30; просмотров: 71 | Поможем написать вашу работу | Нарушение авторских прав |