Interfaces
Até hoje usei muito pouco Interfaces devido a complexidade de sua utilização com Delphi Win32. Já tive muita dor de cabeça ao tentar usá-las mais amplamente em meu código. O principal problema das Interfaces no Delphi Win32 são as contagens de referência, que são controladas automaticamente pelas classes TInterfacedObject e suas derivadas. Porém esse “automaticamente”, requer que você tome uma série de cuidados na utilização, que eu confesso até hoje não ter entendido completamente.
Porém, ao que me parece, toda essa dificuldade desaparece no .NET, tornando o uso de Interfaces tão simples quanto o uso de uma classe qualquer. Como ainda não migrei praticamente nenhum projeto meu para .NET, ainda não pude tirar proveito disso, mas deixo aqui a dica para vocês realmente entenderem como elas funcionam e tirarem muito proveito das Interfaces, pois é um recurso muito poderoso, deixa seu código muito mais limpo e flexível.
Não vejo a hora de começar a usar!




Para resolver os problemas causados pela contagem de referência, eu criei uma classe basica que anula a contagem e derivo todos os objetos que utilizam interfaces desta classe. Funciona perfeitamente, a unica coisa que preciso tomar cuidado é me certificar que todas as referencias via interface a um objetos sejam nulas antes deste objeto ser destruido, pois o compilador do delphi continua chamando os metodos de incremento e decremento para todas as referencia de interfaces e as vezes ocorre que que o objeto ja foi destruido e por causa de uma interface com referencia valida perdida, ocorre um “Access Violation”. Para anular uma referencia via interface basta atribuir “nil” a ela.
Seguindo estes conselhos a coisa funciona perfeitamente. E depois que voce se acostuma a usar interfaces, voce nao quer mais saber de usar herança.
Faz uns dois anos que para todos os meus mecanismos genéricos e “frameworks” eu só utilizo interfaces.
Interessante a dica, tentarei testá-la em breve. Obrigado!
Olá, gostei da dica, mas não entendi uma coisa, qdo se fala em “anula a contagem” seria o que precisamente?
Como anular a contagem?
Obrigado.
Para anular a contagem de referencia, basta retornar -1 nos métodos de contagem de referência, isto já é feito desde que interfaces foram implementadas no Delphi, em TComponent.
function TExtendedObject._AddRef: Integer;
begin
Result:= -1;
end;
function TExtendedObject._Release: Integer;
begin
Result:= -1;
end;
Eu fiz uma outra implementação, mantendo a contagem de referência, mas que aproxima o comportamento ao do .Net, deixando para que você decida como quer que se comporte, como objeto ou como interface na utilização, e também implementei um método dispose, que verifica como o objeto está sendo tratado, para decidir se diminui a contagem de referência ou se destroy, dependendo de como ele estiver sendo utilizado no momento.
Ok, obrigado pela dica, funciona mesmo cara, valew….
@Jesrael
muito bom, tem como mostrar um exemplo em codigo de como utilizar a contagem de referencia semelhante ao .NET
@David
.NET não tem contagem de referência, ele tem garbage collection.