Nas aulas anteriores criamos classes, aplicamos herança e instanciamos nossos primeiros objetos. Agora vamos aprofundar na estrutura interna de uma classe e entender um dos pilares mais importantes da POO: o encapsulamento. E a chave para aplicá-lo no Delphi está nos escopos de visibilidade.
A estrutura básica de uma classe no Delphi
Toda classe no Delphi é declarada na seção type, seguindo a convenção de começar com a letra T. O Delphi oferece um atalho prático: basta digitar class na seção interface e pressionar Ctrl+Espaço que o IDE gera automaticamente a estrutura completa via Live Template:
type
TExemplo = class
private
// visível apenas para esta classe e classes na mesma Unit
protected
// visível para esta classe, herdeiros e classes na mesma Unit
public
// visível para todos
published
// igual ao public, mas exposto no Object Inspector
end;
Repare que ao declarar TExemplo = class sem informar ancestral, o Delphi entende implicitamente que ela herda de TObject — a classe base que traz o construtor e o destrutor prontos para uso.
Os quatro escopos de visibilidade
O encapsulamento controla quem pode acessar o quê dentro de uma classe. No Delphi, isso é feito com quatro escopos:
- Private: visível apenas para a própria classe e para classes declaradas na mesma Unit (as chamadas “classes amigas”).
- Protected: visível para a própria classe, suas classes herdeiras e as classes amigas da mesma Unit.
- Public: visível para qualquer código que referencie a classe.
- Published: idêntico ao
public, mas os membros também aparecem no Object Inspector do IDE — útil para componentes visuais.
Encapsulamento na prática
Na aula, o Landerson demonstra tudo em um projeto VCL. Ele cria campos nos quatro escopos e mostra o que acontece ao tentar acessá-los de fora da classe:
type
TExemplo = class
private
FPrivado: string;
protected
FProtegido: string;
public
FPublico: string;
published
property Publicada: string read FPublicada write SetPublicada;
end;
Ao tentar acessar FPrivado ou FProtegido diretamente pelo formulário, o compilador acusa erro — e é exatamente isso que queremos. Para expor um dado privado de forma controlada, criamos um método getter dentro da própria classe:
function TExemplo.GetPrivado: string;
begin
Result := FPrivado; // FPrivado está acessível DENTRO da classe
end;
Já o campo FProtegido pode ser acessado por uma classe herdeira. O Landerson cria a classe TSubExemplo, que herda de TExemplo, e demonstra que dentro dela é possível ler FProtegido normalmente — porque o escopo protected foi exatamente criado para isso.
Assista à aula completa
Para acompanhar a série desde o início, veja também o post anterior: Instanciando Objetos e Refatorando Units no Delphi — POO Aula 03.