Home > Geral > Interfaces

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!

Categories: Geral Tags:
  1. Adriano Rochedo
    June 20th, 2005 at 02:30 | #1

    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.

  2. Erick
    June 20th, 2005 at 08:59 | #2

    Interessante a dica, tentarei testá-la em breve. Obrigado!

  3. February 26th, 2009 at 09:41 | #3

    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.

  4. Cesar Romero
    May 25th, 2009 at 10:38 | #4

    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.

  5. Jesrael
    May 26th, 2009 at 08:08 | #5

    Ok, obrigado pela dica, funciona mesmo cara, valew….

  6. David
    November 19th, 2009 at 10:37 | #6

    @Jesrael
    muito bom, tem como mostrar um exemplo em codigo de como utilizar a contagem de referencia semelhante ao .NET

  7. December 6th, 2009 at 19:41 | #7

    @David

    .NET não tem contagem de referência, ele tem garbage collection.

  1. No trackbacks yet.