AULA 7 - Programação II - Graduação
Separando a interface da implementação
Conforme tudo que já foi descrito até o momento, o objetivo maior do encapsulamento de classes é preservar o sigilo acerca do código que vai ser implementado na classe.
Assim, é necessário que as classes sejam códigos independentes e fechados, que chamamos de IMPLEMENTAÇÃO DA CLASSE, compilados separadamente do restante do código-"cliente" (que serve de entrada/saída de dados com o usuário - INTERFACE COM O USUÁRIO), mas rodados juntos, linkados, para que funcionem conjuntamente.
O código-cliente vai ter acesso apenas aos Métodos e Atributos públicos dos objetos.
- Métodos Públicos: são também chamados de INTERFACES DA CLASSE, pois serão usados diretamente pelos CLIENTES (programas usuários) para manipular os dados da classe.
A interface da classe normalmente é publicada na forma de Cabeçalhos (protótipos), em um arquivo de cabeçalho (*.h), fornecido junto com o executável da classe.
Exemplo:
Separando os códigos de interface com o usuário da implementação da classe Horario:
Primeiro, em um arquivo *.h escreve-se a declaração da classe (INTERFACE DA CLASSE):
/* horario1.h - Declaração da classe Horario */
#ifndef HORARIO1_H
#define HORARIO1_H
class Horario
{ public:
Horario( );
void SetaHora(int, int, int);
void ImprimeMilitar( );
void ImprimePadrao( );
private:
int hora, minuto, segundo;
};
#endif
Colocar inicialmente as diretivas como comentário, até que se tenha certeza que não há erros no código da classe.
Depois, em um arquivo *.cpp escreve-se a IMPLEMENTAÇÃO da classe, isto é, todos os códigos de seus métodos, principalmente os privados.
/* horario1.cpp - Definição dos métodos de Horario */
#include <iostream>
#include “horario1.h”
Horario::Horario( ) {hora=minuto=segundo = 0;}
void Horario::SetaHora(int h, int m, int s)
{ hora = (h>= 0 && h < 24)? h:0;
minuto = (m>= 0 && m < 60)? m:0;
segundo = (s>= 0 && h < 60)? s:0; }
void Horario::ImprimeMilitar( );
{ cout << (hora < 10? “0”:”“) << hora << “:” << (minuto < 10?”0”:”“) << minuto;
}
void Horario::ImprimePadrao( )
{ cout<<((hora==0 || hora==12)? 12:hora%12) << “:” << (minuto < 10?”0”:”“)<< minuto << “:” << (segundo < 10? ”0”:”“) << segundo << (hora<12? “da manhã”: “da tarde”); }
Note que é imprescindível incluir-se o arquivo de cabeçalho, no arquivo de implementação.
Compilar estas unidades (horario1.h e horario1.cpp) em separado, p. e., em um aplicativo/Projeto comum que testa a classe.
Criar outro aplicativo, este sim o Cliente, e incluir o arquivo horario1.obj no projeto.
Acrescentar também a linha #include “horario1.h” onde a classe for utilizada.
/* IntImpl.cpp - Aplicativo para testar a classe Horario */
#include <iostream>
#include “horario1.h”
int main()
{ Horario h;
cout << “A hora militar inicial é: “ ; h.ImprimeMilitar( );
cout << “\n A hora padrão inicial é: “; h.ImprimePadrao( );
h.SetaHora(13,27,6);
cout <<“\n\n Nova hora militar: “; h.ImprimeMilitar( );
cout << “\n Nova hora padrão: “; h.ImprimePadrao( );
h.SetaHora(99,99,99); //valores inválidos para h, m e s
cout <<“\n\n Após inicialização inválida: \n Hora militar: “;
h.ImprimeMilitar( ); cout << endl;
return 0;
}






