Sei sulla pagina 1di 45

Universidade Estadual de Londrina Departamento de Computao Disciplina:Laboratrio de Programao-A

(2o ano do curso de Cincia da Computao - 5COP071) Parte 2

Programao Orientada para Objeto


Prof. Dr. Alan Salvany Felinto email: alan@uel.br (2010)

SUMRIO

Motivao. Noes Histricas. Conceitos: Objetos, classes, mtodos, herana e polimorfismo. Exemplo

MOTIVAO

Problemas da engenharia de software


Aumento da produtividade Gerenciamento da complexidade de desenvolvimento do software Alto custo de manuteno

Objetivo da POO

Diminuir o tempo de desenvolvimento Escrever cdigos que facilite a manuteno Manter a qualidade

NOES HISTRICA

Anos 60, linguagem SMULA-67, primeiros conceitos. Anos 70, SMALLTALK, primeira linguagem orientada ao objeto. Anos 80, a linguagem C - tornou-se popular. Fim dos anos 80: - Linguagens: C#, C++, JAVA, Delphi e outras. - Paradigmas da POO sem a necessidade de investimento em novas linguagens e novos ambientes.

Conceitos

Pilares da POO so: Classe, Objeto, herana e polimorfismo


Caractersticas:
Volume mximo interno Termostato Controle de temperatura Controle do tempo Controle de entrada de metais Controle da saida do lquido fundido Forno de fundio

Conceitos

Pilares da POO so: Classe, Objeto, herana e polimorfismo

Jos

Maria Joo

Jonas

Forno Capacidade Temperatura Tampa

Nome da Classe

CLASSE

Variveis que caracterizam a classe atributos = dados =variveis de instncia=propriedade

Derramar Alterar temp Posio inc.

Aes possveis da classe (mtodos) Protocolo o conjunto de mtodos implementados por uma classe (interface).

A classe define um tipo de objeto. Ex: a Classe Forno define os fornos de fundies. O objeto uma instncia da classe, ou seja o objeto, definido por uma classe, possui atributos especficos inerentes a sua caracterstica. O objeto encapsula os seus atributos e mtodos. Facilita a manuteno do sistema, pois os efeitos colaterais das modificaes esto enclausurados no objeto. Facilita as realizaes de testes isolados, pois a classe independente do sistema.

Exemplo a classe Pilha


Caracterstica: Uma varivel controlando o topo da pilha. Uma funo para inserir um elemento na pilha. Uma funo para desempilhar uma elemento. Obs: Temos que ter cuidado quando se tenta desempilhar uma pilha vazia Temos que ter cuidado quando se tenta empilhar um elemento em uma pilha cheia Imagina:Um programa com 500 pilhas diferentes. Quantas variveis o programador deve controlar ? Pilhas com tipos de elementos diferentes. Possveis erros de programao. Como facilitar a manuteno ?

Exemplo a classe Pilha


Nome da classe

Cpilha Topo Insere(ele) Remove() Construtor Destrutor

Ponteiro para o topo da pilha Cria as condies iniciais necessrias para o bom funcionamento da classe . Finaliza a classe (libera espao na memria)

Classe Criao do Objeto Pilha Utilizao: Cpilha Pilha; Pilha.Insere(5); O usurio da classe no precisa conhecer os detalhes de implementao da classe (encapsulamento dos dados)

mtodos

classe nome_da_classe { mtodos privado: tipo variveis; Atributos tipo nome_mtodo(lista de parmetros); Mtodo .. publico: destrutor_da_classe(void); Destrutor Construtor_da_classe(lista de parmetros); Construtor tipo nome_mtodo(lista de parmetros); Mtodo .. }; privado - atributos ou mtodos que no podem ser acessados por outras rotinas externas a classe. publico - atributos ou mtodos que podem ser acessados por qualquer rotina externa a classe.

Declarao de Classe (independente de linguagens)

nome classe atributos

Declarao da Classe CPilha


class CPilha { private: struct Tpilha{ double Elemento; struct Tpilha *Proximo; } *topo; // somente uma varivel public: void Insere(double elemento); double Remover(void); ~CPilha(void); // Destrutor CPilha(void); // Construtor };

Implementao da classe CPilha


CPilha::~CPilha() { struct Tpilha *p; while (topo != NULL) { p=topo; topo= topo->Proximo; delete p; } } CPilha::CPilha() { topo = NULL; }

Implementao da classe CPilha


void CPilha::Insere(double elemento) { struct Tpilha *p; p = new (struct Tpilha); p->Elemento = elemento; p->Proximo = topo; topo = p; } CPilha Pilha; double a; double CPilha::Remover(void) { struct Tpilha *p; double auxx; if (topo!=NULL) { p = topo; auxx = p->Elemento; topo = p->Proximo; delete p; return auxx; } else return -1; }

Utilizao

Pilha.Insere(8); a = Pilha.Remover(); // O usurio no conhece os detalhes de implementao

Exerccio
Implemente a classe Cpilha, considerando as seguintes caractersticas: Utilize um vetor de inteiros de 10 posies para armazenar os elementos na pilha. Utilize um ndice para controlar os armazenamentos na pilha, se ndice for igual a -1 significa que a pilha est vazia, caso o ndice for 9 significa que a pilha est cheia, portanto no h mais espao no vetor para armazenar elementos. Implemente o mtodo insere elemento, o mtodo remove elemento e tudo que for necessrio para garantir o bom funcionamento da classe Cpilha.

Uma classe pode ser composta por vrias classes


BRAO

CABEA

BRAO

CORPO

PERNA

PERNA

PESSOA

Uma classe pode ser composta por vrias classes


Imagine que exista um estacionamento com a seguinte configurao:
Como seria a soluo do problema do estacionamento ?

Espao destinado para o auxlio de manobras

Exerccios
Construa e teste a classe dos nmeros complexos. Implemente os seguintes mtodos e os demais que forem necessrios para garantir o bom funcionamento da classe dos nmeros complexos: Soma de nmeros complexos. Subtrao de nmeros complexos. Multiplicao de nmeros complexos. Magnetude do nmero complexo. |a+bi| = sqrt(a*a+b*b) ngulo do nmero complexo. atan2(Im,Re); Coordenada polar do nmero complexo void coord_polar(double mag, double ang) Re = magnetude * cos(ngulo); IM = magnetude * sin(ngulo);

Exerccios
Construa e teste a classe do tipo de dado vetor de nmeros complexos.

HERANA
PESSOA

Genrico

IDADE COR ENDEREO Atualiza dados

Classe base, pai ou super classe

Especfico Subclasse classe filha

Cliente

fornecedor

funcionrio Funo Setor

compra

vende

Hierarquia de classes

HERANA

Vantagens obtidas pela herana: O reaproveitamento do cdigo agiliza o desenvolvimento do sistema sem alterar a sua qualidade e evita erros de programao. Facilita a expansibilidade do sistema, ou seja, com pequenos ajustes o sistema cresce facilmente sem que haja a necessidade de alterao da programao.

POLIMORFISMO

Polimorfismo quer dizer vrias formas. Uma nica forma para acessar vrios mtodos, que possuem diferentes implementaes. O polimorfismo nos possibilita maior abstrao no desenvolvimento de um sistema. Uma funo que desenhe uma figura geomtrica, etc....

EXEMPLO DE POLIMORFISMO
FIGURA COORDENADAS DESENHAR APAGAR DESLOCAR

CRCULO RAIO

RETNGULO ALTURA LARGURA DESENHAR

IMAGEM MATRIZ DE PONTOS DESENHAR PINTAR PONTO APAGAR PONTO

DESENHAR

Herana em C++ Builder


classe classe_filha: mtodo _de_acesso Classe_pai { privado: S os mtodos da protegido: classe filha tem acesso O acesso aos dados e mtodos so dados a classe filha e a seus herdeiros Todo mundo tem acesso

publico:
};

Herana em C++

Mtodo_de_acesso
privado protegido pblico

Classe base protegido e pblico protegido e pblico pblico protegido

Classe derivada privado protegido pblico protegido

Classes derivadas e objetos


class filhopri: private pai { class pai { private: private: int d4; int d1; int m4(){return d4+d2+d3;}; int m1(){ return (d1);}; protected: protected: int d5; int d2; int m5(){d4=d3+d6+d4;}; int m2(){ return (d2);}; public: public: filhopri():pai() pai(){ d1=1; d2=2; d3=3;} {d4=1; d5=2; d6=3;}; pai(int a, int b, int c) filhopri(int a, int b, int c):pai(a, b, c) { d1=a; d2=b; d3=c;} {d4=a; d5=b; d6=c;}; int d3; int d6; int m3(){ return (d3);}; int m6() {return d3;}; }; };

Herana de Classe
class pai { private: int d1; int m1(); protected: int d2; int m2(); public: pai(); int d3; int m3(); }; pai::pai(){ d1=1; class f1 : private pai { int f1 :: m4() d2=2; { private: d3=3; return (1); int d4; } }; int m4(); int pai :: m1(){ int f1 :: m5() protected: return (d1); { int d5; }; return (1); int m5(); int pai :: m2(){ }; public: return (d2); int f1 :: m6() int d6; }; { int m6(); int pai :: m3() return (1); }; { }; return (d3); };

Detalhes de Implementao
int funo(int p) { return p * 3; } char funo(char p) { return p + 3; } int funo(int p,char* s) { return p * strlen(s); }

Sobrecarga de Funes

Construtor e Destrutor
class pai { protected: int d2; int m2(); public: pai(){ d2 = 0; }; pai(int a){ d2=a; }; }; class f2 : public f1 { public: ~f2(){ d4 = 0; } f2():f1(1){ d4 = 4;}; f2(int a):f1(a), d9(a) { d7= 5; }; int d9; }; f2 filho1(5); Considerando f1(int a) a ordem de execuo : 1.pai(int a); 2.f1(a); 3.d9(a); 4.D7=5;

class f1 : public pai { public: ~f1(){ d4 = 0; } f1():pai(1){ d4 = 4;}; f1(int a):pai(a), d6(a) { d7= 5; }; int m6(); int d6; int d7; int d4; };

Sobrecarga de Operadores
void CPilha::operator + (double elemento) { struct Tpilha *p; p = new (struct Tpilha); p->Elemento = elemento; p->Proximo = topo; topo = p; }

CPilha Pilha, *p = new CPilha; double a; Pilha.Insere(8); Pilha + 9; a = Pilha.Remover(); cout << a << endl; a = Pilha.Remover(); cout << a << endl;

Templates
void troca(int& x, int& y) { int tmp = x; x = y; y = tmp; }

template<class T> void troca(T& x, T& y) { T tmp = x; x = y; y = tmp; }

template <class T> T maior (T a, T b) No programa principal { float x =9, y=10.5; T result; troca <float> (x, y); result = (a>b)? a : b; cout << x << endl; return (result); cout << maior <float>(x,y) << endl; } // Qual o resultado do processamento ?

Pilha com Template


Indica o template template< class Tipo > class Pilha { No programa principal: private: Pilha<double> pilha( 5 ); int tamanho; OBS: template< class T, class V, ... > int topo; Tipo *pont; public : Pilha( int tam) { topo = -1; // indicao de pilha vazia. if (tam > 0) tamanho = tam; else tamanho = 10; pont = new Tipo[ tamanho ]; } ~Pilha() { delete [] pont; }; }; Exerccio: Implementar a classe Vetor

cdigo

Exerccios
Construa e teste a classe dos nmeros complexos. Implemente os seguintes mtodos e os demais que forem necessrios para garantir o bom funcionamento da classe dos nmeros complexos: Soma de nmeros complexos . (a+bi) + (c+di)= (a+c)+(b+d)i Subtrao de nmeros complexos. (a+bi) - (c+di)= (a-c)+(b-d)i Magnetude do nmero complexo. |a+bi| = sqrt(a*a+b*b)

Mtodo Virtual
Um mtodo virtual permite a sua redefinio nas classes herdeira. A diferena notada quando se utiliza ponteiro.

class pai { public: virtual int m10() { return 1; }; };


pai *p; A resposta 2 f1 filho1; p = &filho1; cout << p->m10() << endl;

class f1 : public pai { public: int m10() { return 2; }; };


OBS: Se for retirado a palavra Virtual da classe pai a resposta seria 1

Mtodo Virtual e Classe Abstrata


Uma classe abstrata se pelo menos um dos seus mtodo for puramente virtual. Um mtodo puramente virtual tem que ser redefinido nas classes herdeiras. No se pode criar objetos a partir de classes abstratas Exemplo de uma classe abstrata
class pai { public: virtual int m10() = 0; }; Mtodo puramente virtual

Funes amigas
Fornece o acesso aos dados privados e protegido de uma classe
class testaamigo { friend int testa(testaamigo ta); private: int I; public: testaamigo() {I = 0;}; void altere(int a){ I=a;}; int m1() {return 1;}; };

int testa(testaamigo ta) { return ta.I; };

int main(int argc, char *argv[]) { testaamigo tf; tf.altere(4); cout<< testa(tf) << endl; system("PAUSE"); return EXIT_SUCCESS; }

class conta { public:

static
Compartilha uma mesma regio de memria:

static int contagem; //atributo global a todos objetos


//da classe conta static void altera(int i) { contagem = i;}; conta(){ contagem++; }; void imprime(){ cout << contagem << endl; }

}; int conta::contagem =0; Exemplo de uso: conta a,b; a.imprime(); b.altera(5); a.imprime(); conta::altera(10); b.imprime();

Resposta do processamento: 2 5 10

DESENVOLVENDO UM PROGRAMA ORIENTADO AO OBJETO


1. Definir os objetos principais que compem o sistema. 2. Definir os atributos dos objeto. 3. Definir os objetos secundrios e os seus atributos. 4. Estruturar a hierarquia de classes que representem os objetos da soluo. 5. desenvolver as interfaces dos objetos. 6. Desenvolver uma seqncia inicial de expresses que represente uma soluo de alto nvel para o problema. 7. Implementar os mtodos que representem todas as mensagens. 8. Refinar o projeto.

ANALOGIA ENTRE POO E PE


Tcnicas tradicionais (estruturadas) Dados (variveis) Tcnicas Orientadas ao Objeto Objetos

Funes, procedimentos e Mtodos subrotinas Chamadas de funes ou Mensagens de procedimentos Tipo de dado abstrato Classe Inexistente Hereditariedade

Programao Orientada para o Objeto

Em POO o problema decomposto em vrios objetos e cada objeto encapsula as suas variveis e mtodos, o que facilita a manuteno e teste. Em POO toda a programao voltada para a produo de componentes de software (classe) reutilizveis.

SOLUO ORIENTADA AO OBJETO (Resumo)


Encapsulamento dos dados (objetos) - Simplificao das variveis que controlam as funes, procedimentos e o sistema - Direcionamento da manuteno - Diminuio da probabilidade de erros no processo de programao

Reutilizao de cdigos

Classes podem ser misturadas e modificadas para a criao de novas aplicaes


Diminuio da complexidade do desenvolvimento do software e aumento da produtividade Cdigos de alta qualidade disponveis

Hereditariedade

SOLUO ORIENTADA AO OBJETO (Resumo)


Mdulos de software intercambiveis Criao de biblioteca de classes Salto na Industria de Software

Comandos pr-existentes escritos, testados e depurados Modularidade de informao Reusabilidade por meio de hereditariedade e polimorfismo

Ex: Biblioteca para a construo de interfaces grficas. - Maior qualidade - Menor tempo de desenvolvimento

Lista de exerccios
1. O que classe ? Quais as vantagens obtidas com a utilizao de classes? 2. O que herana ? Quais as vantagens obtidas com a utilizao da herana? 3. O que polimorfismo? cite dois exemplos prticos. 4. Explique com suas palavras o que um mtodo virtual, cite um exemplo. 5. O que dado privado, protegido e pblico ? 6. Na implementao da herana de classes, em C++, quais so os tipos de acesso aos dados e mtodos da classe base? Explique as suas diferenas. 7. Defina construtores e destrutores. De um exemplo de cada um C++.

Lista de exerccios
8. Utilizando programao orientada ao objeto, implemente uma fila utilizando alocao dinmica de memria. O primeiro que entra o primeiro que sai. os mtodos a serem implementados so insere, remove Obs: a fila armazena nmeros inteiros insere utilizando o ponteiro fim e remove pelo ponteiro incio fim incio

Lista de exerccios
9. Considerando o exerccio anterior (nmero 8) e utilizando o conceito de herana, implemente uma nova classe que possua os seguintes mtodo: ordena, insere ordenado, remova um determinado elemento desta classe. Obs: no remover, caso no haja elemento o mtodo retorna 0 caso o elemento for removido com sucesso este mtodo deve retornar 1, e o elemento do tipo inteiro que foi removido.

Bibliografia
JACOBSON, I.; JONSSON, m. C. P.; VERGAARD; G. Object - Oriented Software Engineering. A Use Case Driven Approach. ADDISON-WESLEY PUBLISHING. 1993. Manuais do BORLAND C + +. PRICE, A.M. A. Extenso dos paradigmas Logico e funcional a objetos. XIV Congresso da Sociedade Brasileira de computao. XIII Jornada de Atualizao em Informtica, Caxambu -MG, Brasil 1994. WIENER, R. S.; PINSON, L.J. Programao Orientada para Objeto e C + +. So Paulo: Makron Books, McGraw-Hill, 1991. WIENER, R. S.; PINSON, L.J. Programao Orientada para Objeto, Manual Prtico e Profissional. So Paulo: Makron Books, McGraw-Hill, 1991. WINBLAD, Ann L. W.; EDWARDS, Samuel D.; KING, David R. Software Orientado ao Objeto. So Paulo: Makron Books, 1993. Material pesquisado na Internet.

Potrebbero piacerti anche