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.