{$codepage utf8} {$mode objfpc} Unit UClase01; Interface Uses sysutils; Type TClase01=class //cualquier clase descendiente y objeto tienen acceso Constructor Crear(n:integer); strict private //ninguna clase descendiente y objeto tienen acceso B01:integer; protected //cualquier clase descendiente tiene acceso incluso los que estan // en otra unidad, los objetos no tienen acceso si estan en otra unidad. Function Formato:string; private //cualquier clase descendiente que sólo este en la misma //unidad tiene acceso, los objetos no tienen acceso si estan en otra unidad. C01:integer; public //Se crea ObtenerB01 para que el método Formato de TClase02 //pueda acceder a B01 de modo indirecto. Function ObtenerB01:integer; Procedure Mostrar; End; TClase02=class(TClase01) protected Function Formato:string; public procedure Mostrar; End; implementation Constructor TClase01.Crear(n:integer); Begin B01:=n; C01:=n End; Function TClase01.Formato:string; Begin Formato:='Esta clase tiene = '+IntToStr(B01)+#13+#10+'C01 = '+IntToStr(C01) End; Function TClase01.ObtenerB01:integer; Begin ObtenerB01:=B01 End; Procedure TClase01.Mostrar; Begin Writeln(Formato) End; Function TClase02.Formato:string; //TClase02.Formato, puede acceder al campo C01 porque esta en private. //Pero para acceder a B01 se debe usar el método ObtenerB01, porque //B01 esta en strict private //Si la clase TClase02 estuviera en otra unidad, entonces //en la clase TClase01 se debe crear un método que nos permita //acceder al campo C01. Begin Formato:='Esta otra clase tiene = '+IntToStr(ObtenerB01)+ #13+#10+'C01 = '+IntToStr(C01) End; Procedure TClase02.Mostrar; Begin Writeln(Formato); End; End.