Delphi - сбориник статей

       

Новые возможности Delphi


Как уже отмечалось, записи не могут иметь вариантных частей, но могут - процедуры и функции. Это в какой-то степени сближает их с классами. Вот пример объявления:

type MyRec = record a: Integer; procedure aProc; end; procedure MyRec.aProc; begin end;

Несмотря на похожесть, записи, конечно, не классы - в них нет механизмов наследования и полиморфизма.

.NET позволяет интегрировать в единое целое код, написанный на разных языках, в которых используются, в общем случае, разные ключевые слова. Как быть, если в CTS определен класс, совпадающий с ключевым словом? В Delphi для этого можно использовать стандартный прием - составное имя. Например:

var T: System.Type;

Однако "путь" к классу может быть достаточно длинным, и составное имя окажется громоздким. В этом случае Delphi разрешает перед именем класса ставить символ "&" (амперсанд):

var T: &Type;

Встретив такое описание, компилятор станет просматривать список доступных модулей в поисках типа Type и найдет его в модуле System.

Существенным изменениям подверглось объявление класса. Дело в том, что Delphi и CLR по-разному трактуют области видимости секций private и protected: в Delphi члены, объявленные в этих секциях, видны всюду в пределах данного модуля. В CLR секция private объявляет члены, доступные только внутри методов класса, а секция protected - члены, доступные потомкам класса. В связи с этим, в Delphi перед названиями секций следует ставить спецификатор class - в этом случае области видимости в Delphi и CLR совпадут:

type MyClass = class class private a: Integer; // Поле видно только в методах класса MyClass class protected b: Boolean; // Поле видно только потомкам класса и //самому классу end;

Классы можно лишить потомков, а виртуальный метод - возможности перекрытия. Для этого объявление класса сопровождается директивой sealed, а объявление метода - директивой final:

type NoInst = class public procedure NoOverride; dynamic; final; // Метод нельзя перекрыть end sealed; // Класс не может иметь потомков

Приведенный выше пример лишь иллюстрирует синтаксис объявлений и по существу бессмыслен: если класс не имеет потомков, то ни один его метод не может быть перекрыт. Замечу, что следующее объявление ошибочно:

procedure NoOverride; final;

Можно лишить возможности перекрывать только виртуальные методы, то есть объявленные с директивами dynamic, virtual или override.




Содержание раздела