separados, nomeados classe.h e classe.m; o primeiro contem a secao @interface e o segundo @implementation. O arquivo de interface diz ao compilador como a sua classe e, enquanto que o arquivo de implementacao contem o codigo verdadeiro da classe.Para realizar ligar os diversos arquivos devemos compilar o programa de uma forma especial, bem como nos utilizar da diretriz de pre-processamento #import. Observe a nova implementacao do programa do gato:Gato.h//// Classe Gato - interface // // por Alberto GOK Martins // para o tutorial de ObjC //#import <objc/Object.h>@interface Gato: Object{ double peso;}-(void) miau;-(void) setPeso: (double) p;-(double) getPeso;-(Gato *) reproduzir: (Gato *) Gato2;@endGato.m// // Classe Gato - implementacao // // por Alberto GOK Martins // para o tutorial de Objc //#import <stdio.h>#import "Gato.h"@implementation Gato-(void) miau{ printf("Miaau!\n");}-(void) setPeso: (double) p{ peso=p;}-(double) getPeso{ return peso;}-(Gato *) reproduzir: (Gato *) Gato2{ // funcao para criar um gato filho com a media dos pesos dos pais // antes de algum protesto, nao estamos tentando ser biologicamente corretos! Gato *Gatinho=[[Gato alloc] init]; double pesoGatinho; pesoGatinho = (peso+[Gato2 getPeso])/2; [Gatinho setPeso: pesoGatinho]; return Gatinho;}@endmain.m// // Programa Gato com caracteristica // em multiplos arquivos // // por Alberto GOK Martins // para o tutorial de ObjC //#import <stdio.h>#import "Gato.h"int main( int argc, const char *argv[] ){ Gato *meuGato = [[Gato alloc] init]; Gato *meuGato2 = [[Gato alloc] init]; Gato *meuGatoFilho; [meuGato setPeso: 4.2]; [meuGato2 setPeso: 4.9]; [meuGato miau]; [meuGato2 miau]; meuGatoFilho = [meuGato reproduzir: meuGato2]; [meuGatoFilho miau]; printf("meuGato pesa: %lf kg\n",[meuGato getPeso]); printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]); printf("meuGatoFilho pesa: %lf kg\n",[meuGatoFilho getPeso]); [meuGato free]; [meuGato2 free]; [meuGatoFilho free]; return 0;}Preste especial atencao em como a diretiva #import e utilizada. O arquivo Gato.h precisa de informacoes sobre a classe Object que foi definida no arquivo objc/Object.h, e por isso devemos importa-lo em Gato.h. Ja o arquivo Gato.m deve importar o arquivo de interface de sua classe, o Gato.h, bem como stdio.h, pois utiliza a funcao printf. Finalmente, o programa principal deve importar o arquivo stdio.h pela funcao printf e o arquivo Gato.h por instanciar objetos da classe Gato. Isso pode parecer um pouco confuso, mas na verdade o conceito e bastante simples: deve-se importar tudo o que for utilizar.Para compilar programas com multiplos arquivos no gcc, use a seguinte linha de comando:gcc arquivo1.m arquivo2.m main.m -o nome_do_programa -l objcno caso do nosso programa, use:gcc Gato.m main.m -o gato -l objcexecute o programa e veja o resultado; ele deve ser similar ao apresentado abaixo:Miaau!Miaau!Miaau!meuGato pesa: 4.200000 kgmeuGato2 pesa: 4.900000 kgmeuGatoFilho pesa: 4.550000 kgHerancaNesta secao falaremos sobre um dos conceitos mais importantes da programacao orientada a objetos: a heranca.Uma classe pode ter a si mesma como superclasse, e essa classe, que nao possui superclasse e denominada classe raiz (ou root). A classe raiz pode ser programada por voce mesmo, ou entao como e mais comum, ser a classe Object, descrita em objc/Object.h ou a classe NSObject, descrita em Foundation/NSObject.h.A classe que foi criada neste tutorial e uma subclasse de Object, e com isso ela herda certos metodos, como free e outros que foram definidos para a classe Object. No entanto suponha que agora seja