четверг, 1 марта 2012 г.

Поля

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

О полях

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


Чтобы определить компонент-поле для класса, просто объявите поле, как вы стали бы объявлять переменную. Например, следующее объявление создает класс с именем TNumber, единственным компонентом которого, кроме тех, что наследуются от System.TObject, является целочисленное поле с именем Int:

 type
   TNumber = class
     var
       Int: Integer;
   end;

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

Поля связываются статически, то есть ссылки на них разрешаются во время компиляции. Чтобы понять, что это означает, рассмотрим следующий пример:

type
    TAncestor = class
       Value: Integer;
    end;
 
    TDescendant = class(TAncestor)
       Value: string;    // hides the inherited Value field
    end;
 
 var
    MyObject: TAncestor;
 
 begin
    MyObject := TDescendant.Create;
    MyObject.Value := 'Hello!'     // error
 
   (MyObject as TDescendant).Value := 'Hello!'   // works!
 end;

Хотя MyObject хранит экземпляр TDescendant, он объявлен как TAncestor. По этому компилятор интерпретирует MyObject.Value как ссылку на целочисленное поле, объявленное в TAncestor. Тем не менее, оба поля существуют в объекте TDescendant, но наследуемое поле Value перекрыто новым и доступно только через преобразование типа.

Константы и типизированные константы могут встречаться в классах и неанонимных записях в глобальной области видимости. И константы и типизированные константы можно встретить также внутри объявления встроенных типов. Константы и типизированные константы могут встретиться только внутри объявления класса, причем если он объявлен локально по отношению к процедуре (то есть не может встретиться внутри записей, объявленных внутри процедуры).


Поля класса

Поля класса - это поля данных, объявленные в классе и доступные без ссылки на объект (в отличии от обычных "полей экземпляра", которые обсуждались выше). Данные, хранимые в поле класса, хранятся во всех экземплярах класса и могут быть доступны при обращении к классу или переменной, представляющей экземпляр класса.

Вы можете включить блок полей класса в объявление класса при помощи объявления блока class var. Все поля, объявленные после ключевых слов class var имеют атрибуты статического хранения. Блок class var завершается объявлением:

  • Другим объявлением class var или var;
  • процедуры или функции (то есть метода) (включая процедуры и функции класса);
  • свойства (включая свойства класса);
  • деструктора или конструктора;
  • Может завершаться спецификатором области видимости (public, private, protected, published, strict private и strict protected).
Например:
type
     TMyClass = class
       public
         class var        // Introduce a block of class static fields.
           Red: Integer;
           Green: Integer;
           Blue: Integer;
         var              // Ends the class var block.
           InstanceField: Integer;
     end;

Доступ к полям класса Red, Green и Blue возможен следующим образом:

 TMyClass.Red := 1;
 TMyClass.Green := 2;
 TMyClass.Blue := 3;

Поля класса могут быть доступны через экземпляр класса. Выполнив объявление:

var
  myObject: TMyClass;

Можно получить результат, аналогичный приведенному выше присваиванию значений переменным Red, Green и Blue:

 myObject.Red := 1;
 myObject.Green := 2;
 myObject.Blue := 3;

Комментариев нет:

Отправить комментарий