Recentemente encontrei um problema de Memory Leak em uma aplicação, devido a causa do problema estou fazendo este post para evitar esse tipo de erro.
No Delphi a diretiva virtual permite que seu método seja sobrescrito com o mesmo nome, ou seja, em uma subclasse você pode reescrever um método de acordo com suas necessidades.
Ja a diretiva override significa que o método esta sobrescrevendo o método original, então na frase acima o método sobrescrito deve conter a diretiva override , e o método original a diretiva virtual .
Um erro simples de esquecer uma dessas diretivas pode acontece de ao dar .Free em uma classe não chamar o destructor , ocasionando na não liberação de memória de alguns objetos.
Exemplo:
-
Abaixo temos a classe TRetornoWebService , nessa classe declaramos que o Create pode ser sobrescrito por uma subclasse, e o Destroy está sendo reescrito, pois, a classe TObject do delphi já possui um virtual em seu Destroy .
-
-
Agora na subclasse TRetornoConsultaNFe , que é “filha” da TRetornoWebService , sobreescrevemos o Create e o Destroy das classes ancestrais, nesse caso não foi necessário adicionar o virtual no Destroy da TRetornoWebService, pois, a TObject já possuí um Destroy declarado com virtual.
-
-
Na imagem acima o inherited chama o método original da classe pai após realizar as chamadas acima dele.
Algumas outras diretivas:
virtual - Usado para definir um método que pode ser sobrescrito.
override - Utilizado para definir um método que está sobrescrevendo um método virtual.
abstract - É usado com virtual ou override para definir um método sem implementação que deve ser sobrescrito na subclasse, senão o mesmo não será chamado.
final - Usado com virtual ou override para definir um método que não pode ser sobrescrito.
reintroduce - É como o override, porem, funciona com métodos não dinamicos e não virtuais. Utilizado se você quiser reintroduzir um método e comunicar para o compilador que você não cometeu um engano escrevendo um método com mesmo nome da classe pai.
overload - Essa diretiva permite que você declare um método com mesmo nome, porem, com parâmetros diferentes.