Técnicas de Programação: Programação Orientada a Objeto PROF. PROTÁSIO DEE-UFPB
Programação Orientada a Objeto Herança É uma forma de reutilização de software em que o programador cria uma classe que absorve dados e comportamentos de uma classe existente e os aprimora com novas capacidades. É uma forma de reusar ou aproveitar software já testados e depurados Reusabilidade Denominações 2 Em C++ Java Classe Original Classe Básica Superclasse Nova Classe Classe Derivada subclasse
Herança Exemplo de herança O objeto círculo herda características da classe bidimensional que, por sua vez, herda da classe forma. Ou seja: o círculo é um objeto bidimensional que é uma forma. 3 Forma Bidimensional Tridimensional Círculo Quadrado Triângulo Retângulo Esfera Cubo Tetraedro
Herança Exemplo de programação de herança 4 Veículo Caminhão Automóvel
Classe VEICULO No trecho de código abaixo tem-se a definição da classe veiculo 5 class veiculo int passageiros; int rodas; public: void set_rodas(int num) rodas = num; ; int get_rodas() return rodas; ; void set_pass(int num) passageiros = num; ; int get_pass() return passageiros; ; ;
Classe CAMINHÃO (sem herança) 6 class caminhao Repetição do int passageiros; mesmo código int rodas; da classe veiculo int carga; public: void set_rodas(int num) rodas = num; ; int get_rodas() return rodas; ; void set_pass(int num) passageiros = num; ; int get_pass() return passageiros; ; ; void set_carga(int num) carga = num; ; int get_carga() return carga; ; void show(); Claramente ver-se que boa parte do código de veículo pode ser aproveitada na classe caminhão Ver-se que as particularidades de caminhão (carga, etc...) é que precisam ser programadas
Classe CAMINHÃO (com herança) O : indica que a classe caminhao herda da classe class caminhao : public veiculo veiculos seus int carga; membros public: void set_carga(int num) carga = num; ; int get_carga() return carga; ; void show(); ; 7 public Indica que a classe caminhao só tem acesso aos membros públicos de veiculo Existem outros especificadores: protected private
Classe automovel(com herança) 8 class automovel : public veiculo int tipo; // 0 = Van, 1 = Carro e 2 = SUV public: void set_type(int t) tipo = t; ; int get_type() return tipo; ; void show(); ;
Funções-membros // Descrição das Funções void caminhao::show() cout << "\ninformacao do Caminhao\n"; cout << "Quantidade de rodas: " << get_rodas() << endl; cout << "Quantidade maxima de passageiros: " << get_pass() << endl; cout << "Capacidade maxima para transporte (carga): " << get_carga() << endl; 9 void automovel::show() cout << "\ninformacao do Automovel\n"; cout << "Quantidade de rodas: " << get_rodas() << endl; cout << "Quantidade maxima de passageiros: " << get_pass() << endl; cout << "Tipo de automovel: "; switch(get_type()) case 0: cout << " Van\n"; break; case 1: cout << " Carro\n"; break; case 2: cout << " SUV\n"; break;
Programa Principal int main() caminhao t1, t2; automovel c; 10 t1.set_rodas(18); t1.set_pass(2); t1.set_carga(3200); t2.set_rodas(6); t2.set_pass(3); t2.set_carga(1200); t1.show(); t2.show(); c.set_rodas(4); c.set_pass(10); c.set_type(0); c.show(); system("pause"); return 0;
Separando as definições de classes em arquivos de cabeçalho 11 Considere o programa anterior Coloque a definição da classe veiculo em arquivo separado do arquivo que contém o main.
Separando as definições de classes em arquivos de cabeçalho 12 Passos Adicione um arquivo de cabeçalho BD Add New Item Header File Minhas_classes.h No arquivo principal, inclua: #include "Minhas_classes.h"
#include <iostream> using namespace std; class veiculo // Definicao da classe generica veiculo int passageiros; int rodas; public: void set_rodas(int num) rodas = num; ; int get_rodas() return rodas; ; void set_pass(int num) passageiros = num; ; int get_pass() return passageiros; ; ; class caminhao : public veiculo // Definicao da classe caminhao int carga; public: void set_carga(int num) carga = num; ; int get_carga() return carga; ; void show(); ; class automovel : public veiculo // Definicao da classe automovel int tipo; // 0 = Van, 1 = Carro e 2 = SUV public: void set_type(int t) tipo = t; ; int get_type() return tipo; ; void show(); ; void caminhao::show() // Descrição das Funções cout << "\ninformacao do Caminhao\n"; cout << "Quantidade de rodas: " << get_rodas() << endl; cout << "Quantidade maxima de passageiros: " << get_pass() << endl; cout << "Capacidade maxima para transporte (carga): " << get_carga() << endl; void automovel::show() cout << "\ninformacao do Automovel\n"; cout << "Quantidade de rodas: " << get_rodas() << endl; cout << "Quantidade maxima de passageiros: " << get_pass() << endl; cout << "Tipo de automovel: "; switch(get_type()) case 0: cout << " Van\n"; break; case 1: cout << " Carro\n"; break; case 2: cout << " SUV\n"; break; Minhas_classes.h 13
#include <iostream> #include "Minhas_classes.h" int main() caminhao t1, t2; automovel c; t1.set_rodas(18); t1.set_pass(2); t1.set_carga(3200); t2.set_rodas(6); t2.set_pass(3); t2.set_carga(1200); t1.show(); t2.show(); c.set_rodas(4); c.set_pass(10); c.set_type(0); c.show(); Arquivo Fonte Principal 14 system("pause"); return 0;
Exercício Programe a classe motocicleta que seja derivada da classe básica veiculo e que contenha: Membros privados: numero_capacete Funções públicas: Para setar o número de capacetes disponíveis Para pegar o número de capacetes disponíveis 15
Enumerações Um enum (enumeração) é um tipo definido pelo usuário (programador) que consiste em constantes do tipo int nomeadas. Exemplo usando a diretiva de pré-processamento #define #define BRASIL 0 #define ITALIA 1 #define PORTUGAL 2 #define ALEMANHA 3 Exemplo usando enum enum ; BRASIL, ITALIA, PORTUGAL, ALEMANHA BRASIL = 0 ITALIA = 1 PORTUGAL = 2 ALEMANHA = 3 16
Exemplo usando a diretiva de préprocessamento #define 17 #include <iostream> #define BRASIL 0 #define ITALIA 1 #define PORTUGAL 2 #define ALEMANHA 3 using namespace std; int main() int n; cout << "Digite um numero entre 0 e 4 " << endl; cin >> n; if (n == BRASIL ) cout << "Voce escolheu o Brasil" << endl; else if (n == ITALIA ) cout << "Voce escolheu a Italia" << endl; else if (n == PORTUGAL ) cout << "Voce escolheu Portugal" << endl; else if (n == ALEMANHA ) cout << "Voce escolheu a Alemanha" << endl; else if (n!= BRASIL n!= ITALIA n!= PORTUGAL n!= ALEMANHA ) cout << "Erro: voce escolheu um numero errado!!" << endl; system("pause"); return 0;
Exemplo usando enum #include <iostream> using namespace std; 18 enum ; BRASIL, ITALIA, PORTUGAL, ALEMANHA int main() int n; cout << "Digite um numero entre 0 e 4 " << endl; cin >> n; if (n == BRASIL ) cout << "Voce escolheu o Brasil" << endl; else if (n == ITALIA ) cout << "Voce escolheu a Italia" << endl; else if (n == PORTUGAL ) cout << "Voce escolheu Portugal" << endl; else if (n == ALEMANHA ) cout << "Voce escolheu a Alemanha" << endl; else if (n!= BRASIL n!= ITALIA n!= PORTUGAL n!= ALEMANHA ) cout << "Erro: voce escolheu um numero errado!!" << endl; system("pause"); return 0;
Outro exemplo usando enum 19 #include <iostream> using namespace std; enum Paises BRASIL, ITALIA, PORTUGAL, ALEMANHA ; int main() int n ; cout << "Digite um numero entre 0 e 4 " << endl; cin >> n; Paises pais = (Paises)n; // Conversão explícita (CASTING) if (pais == BRASIL ) cout << "Voce escolheu o Brasil" << endl; else if (pais == ITALIA ) cout << "Voce escolheu a Italia" << endl; else if (pais == PORTUGAL ) cout << "Voce escolheu Portugal" << endl; else if (pais == ALEMANHA ) cout << "Voce escolheu a Alemanha" << endl; else if (pais!= BRASIL pais!= ITALIA pais!= PORTUGAL pais!= ALEMANHA ) cout << "Erro: voce escolheu um numero errado!!" << endl; system("pause"); return 0;
Erro porque ITALIA é definidada 2 vezes 20 enum Paises BRASIL, ITALIA, ALEMANHA ; enum Uvas RUBI, ITALIA, UMOUTROTIPODEUVA ;
Solução namespace Paises enum BRASIL, ITALIA, ALEMANHA ; 21 namespace Uvas enum ; RUBI, ITALIA, UMOUTROTIPODEUVA //*...*// //Modo de uso: std::cout << Uvas::ITALIA; std::cout << Paises::ITALIA;