= Interface ['{31A22D9F-E857-4892-9D17-79FBE9AA7237}'] function Trabalhar:Boolean; function PagarImpostos:Boolean; end; ISerHumano = interface ['{29D48E8C-EFF0-461C-9B9E-D5D7478E5B87}'] function AndarEreto:Boolean; function Falar:Boolean; procedure Ouvir; procedure Correr; end;Basicamente podemos declarar nossa classe como: TBrasileiro = class(TInterfacedObject, ITrabalhador, ISerHumano);Da maneira como esta declarada a nossa classe acima, nos receberemos um codigo de erro do IDE, pois quando definimos que uma classe implementa uma interface, a classe deve contemplar todos os seus metodos implementando-os, se um ou mais de um nao estiverem implementados receberemos um errro como esses abaixo: [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'AndarEreto' [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Falar' [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Ouvir' [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Correr' [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Trabalhar' [Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'PagarImpostos' Sua implementacao e obrigatoria nas classes que utilizam as interfaces, mas ha uma maneira de postergar essa implementacao na qual falarei mais abaixo. Voce com certeza notou que nossa classe descende de TInterfacedObject, e o motivo e simples, essa classe ja implementa de forma segura os metodos obrigatorios definidos em IInterface, ela descende de TObject e facilita o nosso trabalho para controlar o uso de interfaces. E extremamente recomendado o seu uso! Nossa classe utilizando interfaces!Para termos a correta declaracao para a classe acima devemos ter um codigo conforme este: TBrasileiro = class(TInterfacedObject, ITrabalhador, ISerHumano) public // metodos da interface ITrabalhador function Trabalhar:Boolean; function PagarImpostos:Boolean; // metodos da interface ISerHumano function AndarEreto:Boolean; function Falar:Boolean; procedure Ouvir; procedure Correr; end;Dessa forma estamos dizendo que a classe TBrasileiro descende de TInterfacedObject e que implementa os metodos definidos pelas interfaces ITrabalhador e ISerHumano. Postergando a implementacao da interface:Na realidade o que vamos fazer e instruir ao compilador para que ele procure pela implementacao da interface numa classe que esta representada por uma propriedade em nossa classe TBrasileiro, vamos entao ver o codigo: TBrasileiro = class(TInterfacedObject, ITrabalhador, ISerHumano) public // metodos da interface ISerHumano function AndarEreto:Boolean; function Falar:Boolean; procedure Ouvir; procedure Correr; // postergando a implementacao da interface ITrabalhador function GetTrabalhador:ITrabalhador; property Trabalhador:ITrabalhador read GetTrabalhador Implements ITrabalhador; end;Agora podemos receber na nossa propriedade Trabalhador, qualquer classe que implemente a interface ITrabalhador. Dessa forma deixamos a implementacao desses metodos para outra classe compativel, que podera trabalhar sendo chamada sob demanda aliviando assim o peso de uma instanciacao desnecessaria. Implementando a interface ITrabalhador: TProgramador = class(TInterfacedObject, ITrabalhador) public // metodos da interface ITrabalhador function Trabalhar:Boolean; function PagarImpostos:Boolean; // metodos dessa classe procedure Dormir; procedure Acordar; procedure Comer; procedure SurfarNaNet; procedure Programar; end;No nosso metodo GetTrabalhador podemos ter a chamada para uma instancia da classe TProgramador, pois existe a compatibilidade gerada pela interface. function TBrasileiro.GetTrabalhador: ITrabalhador;begin Result := (TProgramador.Create) as ITrabalhador;end;Outra pecuriaridade importante!Ao utilizarmos interfaces nas nossas aplicacoes, devemos reparar que as interfaces sao sempre inicializadas com o valor Nil. E sao liberadas quando estao fora do escopo ou recebem novamente um valor Nil. Ja sei o que voce esta pensando, se elas iniciam com Nil, e fora do escopo ou quando recebem nil sao liberadas entao posso utilizar interfaces para referencias de objetos diminuindo os meus memory leaks! Isso mesmo podemos utilizar as interfaces para trabalhar