Инкапсуляция

private
    <поля и методы, доступные только в пределах модуля>
protected
    <поля и методы, доступные только в классах потомках>
public
    <поля и методы, доступные из других модулей>
published
    <поля и методы, видимые в инспекторе объектов>

Пример был взят из учебника Free Pascal и Lazarus (Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер), где он описан для среды Lazarus и с графическим интерфейсом.

Здесь приводится для IDE Free Pascal.

{$mode objfpc}
 
uses Classes;
 
type TPolygon = class(TObject)
    private
        k: integer;
        p: array of real;
    public
        constructor Create;
        function Perimeter(): real;
    {    function Show(): string; }
    protected
        procedure Set_Input(m: integer);
    published
        Property n: integer read K write Set_Input;
end;
 
constructor TPolygon.Create;
    var i: integer;
    begin
        k := 50;
        setLength(p,k);
        for i := 0 to k-1 do p[i] := 0;
        inherited Create;
    end;
function TPolygon.Perimeter(): real;
    var sum: real;
        i: integer;
    begin
        sum := 0;
        for i:=1 to k-1 do
            sum := sum + p[i];
        Perimeter := sum;
    end;
procedure TPolygon.Set_Input(m: integer);
    begin
        if m > 1 then K:=m else K:=50;
    end;
 
var figure: TPolygon;
    m: integer;
 
begin
    figure := TPolygon.Create;
    write('Number of sides: '); readln(m);
    figure.Set_Input(m);
    writeln('Number of sides: ', figure.n);
    writeln('Number of sides: ', figure.k);
    for m:=0 to figure.k-1 do figure.p[m] := random(50);
    writeln('Perimeter: ',figure.Perimeter():15:2);
 
readln;
end.

В данном случае нет наглядности, что здесь защищается от несанкционированного доступа. Получить значение k можно непосредственно, так и с помощью чтения свойства n.

Также в основной ветке программы без труда можно записать непосредственно в k без использования метода Set_Input():

figure.k := 3;

Видимо, это связано с тем, что обращения осуществляются в одном модуле.