суббота, 19 мая 2012 г.

Вложенные типы

Перевод раздела Nested Type Declarations из справочной системы Delphi

Объявление вложенных типов

Объявления типов могут быть вложены в объявление класса. Вложенные типы часто используются в объектно-ориентированном программировании. Они дают возможность не разделять концептуально связанные типы и избежать конфликтов имен. Синтаксис объявления вложенных типов может быть использован и при работе с компилятором Delphi для Win32.


Синтаксис объявления вложенных типов

nestedTypeDeclaration подчиняется обычным правилам синтаксиса объявления типов.

type
  className = class [abstract | sealed] (ancestorType)
      memberList

      type
         nestedTypeDeclaration

      memberList
  end;

Область объявления вложенного типа заканчивается первым упоминанием элемента, не являющегося идентификатором. Например, ключевыми словами procedure, class, type или спецификаторами области видимости.

К вложенным типам и к типам, которые их содержат, применяются обычные правила доступа. Вложенный тип может иметь доступ к переменной (полю, свойству или методу) класса-контейнера при указании ссылки на объект. Вложенный тип может иметь доступ к полям класса, свойствам класса и статичным методам класса без указания ссылки на объект, но при этом действуют обычные правила области видимости Delphi.

Вложенные типы не увеличивают размер класса-контейнера. Созадание экземпляр класса-контейнера не создает экземпляра вложенного типа. Вложенные типы связаны с классами-контейнерами только по контексту их объявления.


Объявление и доступ к вложенным классам

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

type
      TOuterClass = class
       strict private
          myField: Integer;

       public
          type
             TInnerClass = class
              public
                myInnerField: Integer;
                procedure innerProc;
             end;

         procedure outerProc;
       end;

Для реализации метода innerProc внутреннего класса, вам необходимо специфицировать его имя именем внешнего класса. То есть:

procedure TOuterClass.TInnerClass.innerProc;
begin
   ...
end;

Для доступа к элементам вложенного типа следует использовать точечную нотацию, как при доступе к элементам обычного класса. Например:

var
   x: TOuterClass;
   y: TOuterClass.TInnerClass;

begin
   x := TOuterClass.Create;
   x.outerProc;
   ...
   y := TOuterClass.TInnerClass.Create;
   y.innerProc;

Вложенные константы

Константы могут быть объявлены внутри типов таким же образом, как и вложенные классы. Секции объявления констант завершаются такими же элементами, как и секции объявления вложенных типов, в частности, зарезервированными словами или спецификаторами видимости. Типизированные константы в этом случае запрещены, то есть вы не можете объявить вложенные константы значимых типов, таких как System.Currency или System.TDateTime.

Вложенные константы могут быть любого простого типа: порядковые, порядковые поддиапазоны, перечисления, строки и вещественные типы.

Следующий пример показывает объявление вложенных констант:

type
   TMyClass = class
        const
             x = 12;
             y = TMyClass.x + 23;
        procedure Hello;
        private
             const
                 s = 'A string constant';
    end;

begin
   Writeln(TMyClass.y);   //Выводит значение y, 35.
end.

2 комментария:

  1. Здесь, наверное, понятнее будет перевод nested как "вложенные". Слово "встроенные" легко прочесть как базовые (типы языка).

    ОтветитьУдалить
    Ответы
    1. да. действительно, обычно переводят как "вложенные". недосмотрел. исправлю.

      Удалить