Pola


Pole jest jak zmienna, która przynależy do obiektu. Pola mogą byc dowolnego typu włącznie z klasowym. (T.j. pola mogą przechowywać odwołania do obiektów.) Pola zwykle są prywatne (private).

Aby zdefiniować pole klasy, należy po prostu zadeklarować pole jak zmienną. Wszystkie deklaracje pól muszą występować przed deklaracjami właściwości i metod. Przykład: następująca deklaracja tworzy klasę TNumber, w której poza składnikami dziedziczonymi z klasy TObject występuje pole typu integer o nazwie Int.

type TNumber = class
  Int: Integer;
end;

Pola są ograniczane statycznie, t.j., odwołania do nich są ustalane podczas kompilacji. Aby zobaczyć co to oznacza, rozważ poniższy kod.

type
  TAncestor = class
    Value: Integer;
  end;

  TDescendant = class(TAncestor)
    Value: string;  // ukrywa odziedziczoną wartość pola
  end;

var
  MyObject: TAncestor;

begin
  MyObject := TDescendant.Create;
  MyObject.Value := 'Hello!';               // błąd !!!
  TDescendant(MyObject).Value := 'Hello!';  // OK !
end;

Pomimo, że MyObject zawiera instancję klasy TDescendant, jest zadeklarowany jako TAncestor. Kompilator interpretuje MyObject.Value jako odwołanie do wartości integer pola zadeklarowanego w klasie TAncestor. Jednakże obydwa pola istnieją w obiekcie typu TDescendant; odziedziczone pole Value jest ukrywane przez nowe pole, ale może być dostępne poprzez rzutowanie typu.