Tipos de métodos de uma classe

Classe é um tipo de dado que aponta para um objeto em memória. No entanto, diferente de um ponteiro comum, as classes possuem uma sintaxe rica e que tornam o trabalho com ponteiros para objetos bem mais prático e produtivo. Esta mensagem aborda os tipos de métodos de uma classe.

Conceito

Métodos são rotinas declaradas em uma classe. É o mesmo que uma function ou uma procedure, mas que pertencem a alguma classe. Os métodos podem ser de 4 tipos: de objeto, de classe, construtor e destrutor.

Método de objeto

É o tipo mais comum de método. Sua chamada deve ser feita através de uma variável que aponte para um objeto.

Ex.:

  MeuForm.ShowModal;

Dentro de um método de objeto é possível acessar os membros da classe, no caso de uma classe de formulário, os membros são os componentes e controles visuais (Edit, ComboBox, Label, etc.)

Método de classe

Sua declaração é feita colocando o prefixo class em frente a procedure ou function. Sua chamada também pode ser feita através de uma variável que aponte para um objeto, mas seu diferencial é poder ser acessada através da própria classe, ou através de uma variável que aponte para uma classe.

Ex.:

TMeuForm = class(TForm)
  ...
public
  class function MeuShowModal: Integer;
end;

...

class function TMeuForm.MeuShowModal: Integer;
var
  VForm: TMeuForm;
begin
  VForm := Create(Application);
  try
    Result := VForm.ShowModal;
  finally
    VForm.Free;
  end;
end;

...

begin
  if TMeuForm.MeuShowModal = mrOk then
    ...
end;

Diferente do método de objeto, não é possível acessar membros da classe dentro de um método de classe.

Método construtor

Construtores são um meio termo entre os métodos de classe e os métodos de objeto. Enquanto um método de classe não consegue acessar os membros da classe, um método de objeto só pode ser chamado através de uma variável que aponte para um objeto. O construtor pode tanto acessar os membros da classe como pode ser chamado diretamente pela classe.

Outro comportamento do construtor: sempre que ele é chamado através da classe, ou através de uma variável que aponte para uma classe, ele irá criar um novo objeto na memória e irá retornar o endereço deste objeto:

  VForm := TMeuForm.Create;  // cria um novo objeto da classe TMeuForm
  VForm.Create;  // executa o construtor sem criar um novo objeto

Método destrutor

É um método de objeto, ou seja, não pode ser chamado através da classe nem de alguma variável que aponte para alguma classe. Ele trabalha de forma contrária ao construtor, ou seja, depois que um destrutor é executado, o objeto que o chamou é removido da memória.

  // VForm aponta para o endereço $001a01b5, que é um objeto válido.
  VForm.Destroy;
  // VForm ainda aponta para o mesmo endereço, porém
  // este endereço não possui mais o tal objeto (o formulário)

E quanto ao Free, que é um método de objeto? Sua declaração é algo mais ou menos assim:

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

Ou seja, quem faz o trabalho de remover o objeto é realmente o destrutor, mas apenas se o objeto apontar para algum endereço de memória diferente de nil.