Programação Orientada a ObjetosProgramação Orientada a Objetos
Roberto de Beauclair SeixasRoberto de Beauclair Seixas
[email protected]@lncc.br
Mar/97 Beauclair 2
Agenda
✔ Nivelamento
✔ Histórico
✔ Características da OOP
✔ Terminologia– Definições e Exemplos
✔ Desenvolvimentos de Programas OO
✔ Metodologia de Programação OO
✔ Estudo de Casos (Exercícios Orientados)
Parte 1
Conceitos básicos
Mar/97 Beauclair 4
Nivelamento
✔Programa X Algoritmo X Implementação
✔Técnicas de Programação
✔Abstração X Implementação
Mar/97 Beauclair 5
Algoritmo X Implementação X Programa
✔O que são e quais as diferenças entre:– Algoritmo ?
– Implementação ?
– Programa ?
✔O que é Metodologia ?
✔E Metodologia de programação ?
Mar/97 Beauclair 6
Nivelamento
✔Técnicas de Programação– Programação Não-Estruturada
– Programação Procedimental (ou Procedural)
– Programação Estruturada (ou Modular)
– Programação Orientada à Objetos• Modelo de Eventos
• Callbacks
Mar/97 Beauclair 7
Programação Não-Estruturada
✔Programas simples e pequenos consistindode apenas um programa principal.– Ex. Cartão
✔“Programa” é uma seqüência de comandosou instruções que modificam dados“globais” durante toda a sua execução.
Mar/97 Beauclair 8
Como melhorar este modelo de programação ?
– Extração de seqüências (procedures)
Programação Não-Estruturada
Main Program
Data
Program
Mar/97 Beauclair 9
Programação Procedimental
✔Um programa é visto como uma seqüênciade procedimentos que se “comunicam”através de dados locais, denominadosparâmetros.
✔O fluxo destes dados pode ser ilustradocomo um grafo hierárquico ou uma árvore.
Mar/97 Beauclair 10
Programação Procedimental
Main program
procedure
Mar/97 Beauclair 11
Programação Procedimental
Main programData
Procedure 1 Procedure 2 Procedure 3
Procedure 4
Mar/97 Beauclair 12
Programação Procedimental
✔Desta forma, temos um único programa queé dividido em pequenas partes, chamadas“procedures”. Para permitir o uso deprocedimentos genéricos ou grupo deprocedimentos em outros programas,precisamos separá-los e disponibilizá-los.
Grupo de procedures → módulos / estruturas
Mar/97 Beauclair 13
Programação Estruturada
✔ Um programa não consiste mais de uma única parte em umúnico arquivo. É agora dividido em várias pequenas parteschamados módulos, que interagem, através de chamadasaos procedimentos, formando o programa.
✔ Cada módulo pode ter seus próprios dados. Isto permiteque cada módulo gerencie estruturas de dados internas, quesão modificadas pelas chamadas aos procedimentos.
✔ Entretanto, só existe um estrutura por módulo e cadamódulo só pode existir uma única vez no programa.
Mar/97 Beauclair 14
Programação Estruturada
Main programData
Module 1Data + Data 1
Module 2Data + Data 2
Procedure 1 Procedure 1 Procedure 2
Mar/97 Beauclair 15
Programação Estruturada
✔Exemplo:– Programas que usam estruturas de dados para
armazenar eficientemente os dados (listas,árvores, matrizes, filas, etc.)
– Cada uma destas estruturas de dados podem sercaracterizadas pela sua “estrutura” e/ou pelosseus métodos de acesso.
Mar/97 Beauclair 16
Programação Estruturada
Problema: Implementar um módulo genéricopara manipulação de listas encadeadas.– Definição da interface (API)
• o que está “disponível” - deve esconder “todos” osaspectos de implementação.
– Implementação
dados dados dados dados
Mar/97 Beauclair 17
Programação Estruturada
/* *** interface definition *** */
boolean list_initialize ();
boolean list_append (ANY data);
boolean list_delete ();
void list_end ();
ANY list_get_first ();
ANY list_get_next ();
boolean list_is_empty ();
Mar/97 Beauclair 18
Programação Estruturada
✔Exemplo de uso:ANY data;
...
data ← list_get_first();
while (data is valid) do
do_something (data);
data ← list_get_next();
end
Mar/97 Beauclair 19
Programação Estruturada
✔Problema:
E para se manipular mais de uma lista ?!?
Mar/97 Beauclair 20
Programação Estruturada
/* *** interface definition *** */
declare type LIST_HANDLE;
LIST_HANDLE list_create ();
void list_destroy (LIST_HANDLE this);
boolean list_append (LIST_HANDLE this, ANY data);
ANY list_get_first (LIST_HANDLE this);
ANY list_get_next (LIST_HANDLE this);
boolean list_is_empty (LIST_HANDLE this);
Mar/97 Beauclair 21
Programação Estruturada
✔Agora, podemos criar “objetos” do tipo“lista”, cada um unicamente identificadospor um “handle”, cujos procedimentos(métodos) operam em função deste“handle”.
✔Mas … ainda existem alguns problemas!
Mar/97 Beauclair 22
Programação Estruturada
✔Criação e Destruição Explícita
procedure foo ()
begin
LIST_HANDLE my_list;
my_list ← list_create ();
… /* do something with my_list */
list_destroy (my_list);
end
Mar/97 Beauclair 23
Programação Estruturada
✔Ora, quando se usa variáveis, não se precisa“criá-las” e “destruí-las”. Então, porqueprecisamos fazer isto com as listas ?
Procedure foo ()
begin
LIST_HANDLE my_list;
… /* do something with my_list */
end
Mar/97 Beauclair 24
Programação Estruturada
✔ Não acoplar dados com operações !
✔ Módulos são agrupados por operações comuns,tais como as “list_operations” do exemploanterior. Usa-se então estas operações, passando-se os dados, explicitamente, como parâmetros.
✔ Esta abordagem resulta numa estrutura “orientadaà operações”. Podemos até dizer que as operaçõesespecificam ou definem os dados a serem usados.
Mar/97 Beauclair 25
Programação Orientada a Objetos
✔ Na Orientação a Objetos, a estrutura é organizadapelos dados. Escolhe-se a representação dos dadosque melhor se adequam aos requisitos doproblema.
✔ Consequentemente, os programas ficamestruturados pelos dados e não pelas operações.Isto significa que os dados apenas especificarãooperações válidas. Agora os módulos serãoagrupados por dados e suas representações,denominadas classes.
Mar/97 Beauclair 26
Programação Estruturada
✔OOPS! Dados Errados.Procedure foo() begin
data_type data1;
other_type data2;
list_handle my_list;
. . .
my_list ← list_create();
list_append (my_list, data1);
list_append (my_list, data2); /* OOPS! */
list_destroy (my_list);
end
Mar/97 Beauclair 27
Programação Estruturada
✔ É nossa responsabilidade assegurar que a lista éconsistente. Uma possível solução é adicionarinformações a respeito do tipo de cada elementoda lista.
✔ No entanto, o que realmente queremos é ummecanismo que nos permita especificar qual o tipodos dados a ser manipulado na lista, mantendo asmesmas funções. Ou seja, uma lista que armazenenúmeros, carros, maças ou pessoas, tem asmesmas operações.
Mar/97 Beauclair 28
Programação Orientada a Objetos
✔Em OO existe o conceito de “template”, que“casa” as operações com os dados.
✔Exemplo:– LIST_HANDLE <cars> list1; /* lista de carros */
– LIST_HANDLE <people> list1; /* lista de pessoas */
Mar/97 Beauclair 29
Programação Orientada a Objetos
✔Cada objeto “implementa”seus própriosmódulos e dados, permitindo que váriasestruturas coexistam.
✔Cada objeto é responsável por inicializar edestruir os seus dados. Consequentemente,não existe mais a necessidade de explicitaruma chamada aos procedimentos de criaçãoe destruição.
Mar/97 Beauclair 30
Programação Orientada a Objetos
✔Interação de Objetos
Objeto 2Data
Objeto 1Data
Objeto 4DataObjeto 3
Data
Mar/97 Beauclair 31
Implementação de Tipos Abstratos
1 - int i, j, k;
2 - i = 1;
3 - j = 2;
4 - k = i + j;
Mar/97 Beauclair 32
Implementação de Tipos Abstratos
1 - int i, j, k;Para cada instância, uma operação inicial deverá ser
chamada (construtor). No exemplo, isto é feitointernamente pelo compilador, que reserva amemória necessária para o armazenamento denúmeros inteiros e o associa a um nome (binding).Assim, podemos nos referir a “i ” significando umaárea da memória que guarda um valor de númerointeiro que foi “construída” pela definição de “i ”.Opcionamente, o compilador pode inicializar estaárea de memória, por exemplo, com o valor zero.
Mar/97 Beauclair 33
Implementação de Tipos Abstratos
2 - i = 1;
3 - j = 2;
Atribui o valor “1” a variável “i ”. Realiza a operação deatribuição do argumento “1” ao inteiro instanciado por“i ”. Idem para “j ”. Ou seja,
i.set(1);
j.set(2);
Mar/97 Beauclair 34
Implementação de Tipos Abstratos
✔Dois níveis de representação:– Nível dos tipos abstratos de dados:
• Expressamos tudo que é feito com uma instância dotipo abstrato por chamadas a operações pré-definidas.
– Nível de implementação:• Uma representação é escolhida para a operação.
• Por exemplo, em C a implementação da operação“set ” é feita pelo símbolo “=”. Entretanto, em Pascala implementação é feita pelo símbolo “:= ”.
Mar/97 Beauclair 35
Implementação de Tipos Abstratos
4 - k = i + j;
i.add(j);
k.set(i.add(j));
Mar/97 Beauclair 36
Classe
✔É a implementação (representação) de umtipo abstrato de dados. Define atributos emétodos que implementam a estrutura dedados e as operações dos tipos abstratos dedados, respectivamente.
✔Consequentemente, as “classes” definem aspropriedades e o comportamento dosconjuntos de objetos.
Mar/97 Beauclair 37
Classe
class Integer {
// implementação da estrutura de dadosatributos:
int i;
// operações do tipo abstrato de dadosmétodos:
void setValue (int n);
Integer addValue (Integer j);
};
Mar/97 Beauclair 38
Objetos
✔ Um “objeto” é uma instância de uma classe.
✔ Deve ser univocamente identificado pelo seu “nome” edefinir um “estado” que é representado pelos valores dosatributos ao longo do tempo.
✔ O estado dos objetos mudam de acordo com os métodosque lhe são aplicados. Esta seqüência de trocas de estadodefinem o “comportamento” dos objetos.
✔ Assim, O comportamento de um objeto é definido peloconjunto de métodos que podem ser utilizados.
Mar/97 Beauclair 39
Classes e Objetos
✔ Dois grandes conceitos da Orientação por Objetos:Classes e Objetos.
✔ Programar Orientado por Objetos é, portanto, aimplementação de tipos abstratos de dados, ou,simplesmente, a definição de classes.
✔ Assim, em tempo de execução, as instâncias dasclasses, ou seja, os objetos, resolvem o problemapela troca dos seus estados. Conseqüentemente,podemos pensar no programa como uma coleçãode objetos.
Mar/97 Beauclair 40
Pergunta:
Como estes objetos interagem ???
Mar/97 Beauclair 41
Mensagens
✔Um programa OO em execução é naverdade um repositório em que objetos sãocriados, interagem entre si e então sãodestruídos.
✔Esta interação é baseada em “mensagens”que são enviadas de um objeto para outroque indica qual método deve ser aplicado.
Mar/97 Beauclair 42
Mensagens
Integer i; // define um novo objeto
i.setValue(1); // atribui o valor “ 1”
A mensagem “aplique o método setValue com o argumento“1” a si mesmo” é enviado ao objeto “i ”. Note que “enviarmensagem” ao objeto “i ” é simplesmente representado por“.”. Assim, enviar mensagens aos objetos é muito similaras chamadas de procedimentos da programação tradicional.
Mar/97 Beauclair 43
Mensagens
✔ Entretanto, em OO existe uma visão de objetosautônomos que se comunicam pela troca demensagens. Os objetos reagem quando recebemmensagens aplicando-se os métodos.
✔ Uma mensagem é uma solicitação para um objetoexecutar um de seus métodos. A mensagem deveconter o nome e os argumentos do método.
Mar/97 Beauclair 44
Exemplo
Como o computador exibe um
caracter que você digita ??
Mar/97 Beauclair 45
Procedimental
Wait until a key is pressed
get a key value
write key value at cursor position
advance cursor position
Desta forma, fica difícil distinguir entidadesque definirão as propriedades e oscomportamentos.
Mar/97 Beauclair 46
Orientado por Objetos
Objeto tecla Objeto tela
Mensagem que indica queo estado deve ser trocado
para “pressionado”
Mensagem com o código da tecla pressionada
Mensagem para exibir a imagem da
tecla pressionada
Mar/97 Beauclair 47
Exercícios
✔Descreva as seguintes tarefas nas formasprocedimental e na forma OO– ver TV
– comprar um refrigerante na cantina
✔Qual a diferença entre mensagem echamadas a procedimentos ?
✔Identifique os objetos e as mensagens nocontexto da Internet.
Parte 2
Programação (básica)
Orientada a Objetos
Mar/97 Beauclair 49
Histórico
✔Linguagens de Programação
✔OOP
✔C++
Mar/97 Beauclair 50
Linguagens de Programação
linguagens de programação
objetos ? não ⇒ linguagens convencionais
classes ? não ⇒ linguagens com objetos
herança ? não ⇒ linguagens com classes
concorrência ? não ⇒ OOP
OOP concorrente
Mar/97 Beauclair 51
Histórico de OOP
1966 - Dahl & Nygaar Simula
1972 - Kay Smalltalk
1978 - Ingalls
1983 - Goldberg & Robson Smalltalk 80
1985 - Stroustrup C++
1985 - Hewitt Actor
1987 - Yonezawa & Tokoro Parallel OOP
Mar/97 Beauclair 52
Histórico de C++✔ Desenvolvida inicialmente por Bjarne Stroustrup na AT&T -
Bell Laboratories no início dos anos 80.
– Primeira versão comercial 1985
– Primeiras versões eram tradutores
✔ Concebida como extensão do C, mantém todas as facilidades dasua antecessora com o acréscimo da capacidade de permitir aprogramação orientada por objetos.
✔ O C++ pode ser utilizado como um C melhorado, umalinguagem orientada a objetos ou como uma junção das duas.
Mar/97 Beauclair 53
Relacionamento entre C e C++
CLASSES DERIVADAS
CLASSES
C
FRIEND FUNCTIONS
C++
Mar/97 Beauclair 54
Características de OOP
✔Conceitos
✔Programação Tradicional x OOP
✔Ciclo de Vida do Software OOP
Mar/97 Beauclair 55
Conceitos da OOP
✔A programação orientada por objetos (OOP- Object Oriented Programming) baseia-sena construção de programas através dajunção de abstrações de tipos.
✔Um tipo abstrato é composto por dados epelas funções que podem atuar sobre estesdados.
Mar/97 Beauclair 56
Conceitos da OOP✔ A OOP permite a visualização de conceitos como
uma variedade de objetos. Pode-se representar ainteração, as tarefas a serem executadas equaisquer condições que devem ser observadasentre os objetos.
✔ As classes podem conter objetos intimamenterelacionados que compartilham atributos. Umaclasse define as propriedades e os atributos quedescrevem as ações de um objeto pertencentesàquela classe.
Mar/97 Beauclair 57
Programação tradicional versus OOP
✔Programação tradicional– subrotinas e funções formam o programa
– usuário das subrotinas deve conhecer estrutura de dados
– modificações em uma subrotina podem alterar outras
– adaptação de subrotinas para atender a outrosproblemas semelhantes
– difícil manutenção
Mar/97 Beauclair 58
Programação tradicional versus OOP
✔OOP– programa é formado pela junção de tipos abstratos
– não há necessidade do usuário saber a estrutura interna(dados) do tipo abstrato
– alteração interna de um tipo abstrato não altera outros
– fácil manutenção
– “reusabilidade”
Mar/97 Beauclair 59
Programação tradicional versus OOP
tipos abstratos
operação que pode atuarsobre estes tipos
ativar um método
classe ⇒objeto ⇒
⇒ classe
⇒ método
⇒ enviar mensagem
dados + funções
variável de uma classe
Mar/97 Beauclair 60
Programação tradicional versus OOP
struct x class x
dados variável dados variável
funções
funções
Em C++ os dados e as funções fazem parte daclasse e estão intimamente ligados, o quenão ocorre em C.
Mar/97 Beauclair 61
Ciclo de Vida de Software OOmodelo requisitos
mundo real do usuário
requisitos informais
análise dos
requisitos
modelo descritivo biblioteca de
projeto e componentes
construção reutilizáveis
redes de classes
modelo abstração e
conceitual generalização
Mar/97 Beauclair 62
Terminologia
✔Encapsulamento
✔Hierarquia de classes
✔Herança
✔Polimorfismo
✔Funções Virtuais– Definições e Exemplos
Mar/97 Beauclair 63
Encapsulamento✔ Encapsulamento diz respeiro a forma de definição dos
objetos
✔ Em OOP, uma classe é composta de várias seções:
– PRIVADA: é usada para definir a estrutura do tipo dedado;
– PÚBLICA: é usada para as informações de interfaceque tornam a classe reutilizável dentro dos aplicativos;
– PROTEGIDA: é usada para isolar os detalhesfuncionais de objeto externo a classe.
Mar/97 Beauclair 64
Hierarquia de Classes
✔ As classes servem como um padrão para a criaçãode objetos. Os objetos são ocorrências da classe.
✔ Pode-se desenvolver uma hierarquia de classe emque há uma classe-raiz e diversas subclasses ouclasses derivadas.
✔ As classes-raiz representam as tarefas maisgeneralizadas enquanto as subclasses recebemtarefas mais específicas.
Mar/97 Beauclair 65
Herança
✔ Classes derivadas (filhos) herdam todas ascaracterística de seus ancestrais (variáveis efunções) e podem possuir suas próprias.
✔ Classes raiz ou base (pais) devem ser o maisgenéricas possíveis, deixando para seus filhos oque for específico. Com isto, é possível a criaçãode classes altamente sofisticadas sem grandeesforço, já que boa parte do que elas devem fazerjá foi feito por seus “pais”.
Mar/97 Beauclair 66
Herança: Vantagem
Permite um grande reaproveitamento declasses já existentes e testadas, tornando odesenvolvimento de programas mais fácil,mais rápido e mais confiável.
Mar/97 Beauclair 67
Herança simples✔ Novos tipos abstratos, ou classes, podem também ser
criados a partir de outros já existentes.
SHQD�GH�DoR SHQD�GH�RXUR
WLQWHLUR HVIHURJUiILFD
FDQHWD
Mar/97 Beauclair 68
Herança simples
tiposabstratosde dados
subtipos
conceitos
classes classeherança
implementação
Mar/97 Beauclair 69
Herança simples
parte derivada(herdada de X)
parte incremental(código novo
específico de Y)
(herda de)
X (classe base)
Y (classe derivada)
Mar/97 Beauclair 70
Herança: ExemploUtilizaremos o seguinte esquema: #include <stdio.h>
class base
{
protected:
int a;
public:
void set (int i)
{ a = i; }
void printf ()
{ printf (“a = %d\n”, a); }
void get (int &i)
{ i = a; }
void titulo (char *s)
{ printf (“%s \n”, s); }
};
base
deriv1
deriv2
Mar/97 Beauclair 71
Herança: Exemploclass deriv1 : public base
{
protected:
int b;
public:
void set (int i, int j)
{ base :: set (i); b = j; }
void print ( )
{
base :: printf ();
printf (“b = %d\n”, b);
}
void get (int &i, int &j)
{ base :: get (i); j = b; }
};
class deriv2 : public deriv1
{
protected:
int b;
public:
void set (int i, int j, int k)
{ deriv1 :: set (i, j); c = k; }
void print ( )
{
deriv1 :: printf ();
printf (“c = %d\n”, c);
}
void get (int &i, int &j, int &k)
{ deriv1 :: get (i, j); k = c; }
};
Mar/97 Beauclair 72
Herança: Exemplovoid main ( )
{
deriv2 d2;
int i, j, k;
d2.set (1, 2, 3);
d2.titulo (“Teste de deriv 2:”);
d2.print ();
d2.get (i, j, k);
printf (“get: “);
printf (“%d %d %d\n”, i, j, k);
}
Resultados do programa:
Teste de deriv2:
a = 1
b = 2
c = 3
get: 1 2 3
Mar/97 Beauclair 73
Herança múltipla✔ Uma classe pode se tornar “pai” de outras classes e várias
classes podem compor uma nova classe.
carro barco
FDUUR�DQILELR
Mar/97 Beauclair 74
Herança múltipla: ExemploUsaremos o seguinte esquema:
soma mult subt divi
calc
Mar/97 Beauclair 75
Herança múltipla: Exemploclass soma
{
private:
float x, y, z;
public:
soma (float a, float b) { x = a; y = b; }
float exec () { return (x + y); }
};
class subt
{
private:
float x, y, z;
public:
subt (float a, float b) { x = a; y = b; }
float exec () { return (x - y); }
};
class mult
{
private:
float x, y, z;
public:
mult (float a, float b) { x = a; y = b; }
float exec () { return (x * y); }
};
class divi
{
private:
float x, y, z;
public:
divi (float a, float b) { x = a; y = b; }
float exec () { return (x / y); }
};
Mar/97 Beauclair 76
Herança múltipla: Exemploclass calc : public soma, public subt,
public mult, public divi
{
private:
float rso, rsu, rmu, rdv;
public:
calc (float a, float b) : soma (a, b), subt (a, b),mult (a, b), divi (a, b)
{ /* nada */ }
void exec ()
{
rso = soma :: exec();
rsu = subt :: exec ();
rmu = mult :: exec ();
rdv = divi :: exec ();
}
void print ()
{
printf (“soma = %.2f\n”, rso);
printf (“subt = %.2f\n”, rsu);
printf (“mult = %.2f\n”, rmu);
printf (“divi = %.2f\n”, rdv);
}
};
Mar/97 Beauclair 77
Herança múltipla: Exemplo
void main ( )
{
calc tudo (10, 2);
tudo.exec ( );
tudo.print ( );
}
Resultados do programa:
soma = 12.00
subt = 8.00
mult = 20.00
divi = 5.00
Mar/97 Beauclair 78
Herança múltipla: ProblemaComo não temos um controle total sobre classes criadas por
outras pessoas e, ainda assim, podemos usá-las comoclasses base, pode ocorrer o seguinte problema:
base
deriv1 deriv2
deriv3
Mar/97 Beauclair 79
Herança múltipla: SoluçãoPare evitar que sejam criadas várias instâncias da classe base,
esta deve ser definida como virtual nas suas derivadas.
class base { ... };
class deriv1 : public virtual base { ... };
class deriv2 : public virtual base { ... };
class deriv3 : public deriv1, public deriv2
{ ... };
Mar/97 Beauclair 80
Ponteiros e herançaQuando temos uma classe base e várias classes derivadas, um ponteiro da
classe base pode receber como valor o endereço de qualquer uma desuas classes derivadas.
class base { ... };
class d1 : public base { ... };
class d2 : public base { ... };
temos:base *b;
d1 a;
d2 c;
b = &a;
b = &c;
Mar/97 Beauclair 81
Polimorfismo
É a característica pela qual uma únicamensagem pode ser enviada a todos osmembros de uma família de classes (pais eseus filhos), cada um deles respondendo deuma forma particular mediante o seupróprio método. O C++ utilizapolimorfismo através do uso de funçõesdenominadas funções virtuais.
Mar/97 Beauclair 82
Polimorfismo: ExemploPara compreendermos melhor o conceito de polimorfismo, vamos supor que
tenhamos uma classe base de nome DESENHO e as classes derivadas RETA,CIRCULO e QUADRADO. Se possuirmos um método Desenhe virtual,podemos ter:
DESENHO *ptr_desenho;
...
ptr_desenho.Desenhe();
Dependendo do objeto apontado no momento, o método Desenhe responderá deforma correta, mesmo que o tipo de “desenho” a ser feito seja diferente.
Mar/97 Beauclair 83
Herança com Polimorfismo: Exemplo✔ Utilizaremos o seguinte esquema: #include <stdio.h>
class base
{
protected:
int a;
public:
base ( ) { a = 0 };
base (int i) { a = i };
virtual void print ( )
{
printf(“base: %d\n”, a);
}
};
base
drv1 drv2 drv3
Mar/97 Beauclair 84
Herança com Polimorfismo: Exemploclass drv1 : public base
{
protected:
int d1;
public:
drv1 ( ) { d1 = 0 };
drv1 (int i, int j) : base (i)
{ d1 = j };
void print ( )
{
base :: print ();
printf(“drv1: %d\n”, d1);
}
};
class drv2 : public base
{
protected:
int d2;
public:
drv2 ( ) { d2 = 0 };
drv2 (int i, int j) : base (i)
{ d2 = j };
void print ( )
{
base :: print ();
printf(“drv2: %d\n”, d2);
}
};
class drv3 : public base{protected: int d3;public: drv3 ( ) { d3 = 0 }; drv3 (int i, int j) : base (i) { d3 = j }; void print ( ) { base :: print (); printf(“drv3: %d\n”, d3); }};
Mar/97 Beauclair 85
Herança com Polimorfismo: Exemplovoid main ()
{
base b (1);
drv1 d1 (10, 20);
drv2 d2 (100, 200);
drv3 d3 (1000, 2000);
base *ptrbase[4];
ptrbase[0] = &b;
ptrbase[1] = &d1;
ptrbase[2] = &d2;
ptrbase[3] = &d3;
for (int i = 0; i < 4; i++)
ptrbase[i] -> print ();
};
Resultados do programa:
base: 1
base: 10
drv1: 20
base: 100
drv2: 200
base: 1000
drv3: 2000
Mar/97 Beauclair 86
Herança com Polimorfismo: Exemplo
E assim, como fica ?
base
drv1
drv2
drv3
Mar/97 Beauclair 87
Funções Virtuais✔ Estão intimamente associadas ao conceito de polimorfismo.
✔ As funções virtuais são definidas na classe-raiz quando asclasses derivadas subseqüentes “sobrecarregam” a funçãoredefinindo a sua implementação.
✔ São métodos especiais de classes base públicas e podem serativadas através de ponteiros ou referências.
✔ A seleção e ativação de uma determinada função virtual é feitadurante a execução do programa e não em tempo de link-edição,como ocorre com funções normais.
Mar/97 Beauclair 88
Funções Virtuais
✔ Uma das vantagens das classes é a sua habilidadede esconder dados. Entretanto, as friend functionspermitem o compartilhamento de informações daclasse privada com funções não-membro.
✔ As friend functions, que não são definidas naprópria classe, podem compartilhar os mesmosrecursos de classe que as funções-membro, aomesmo tempo que permanecem externas àdefinição de classe.
Mar/97 Beauclair 89
Funções Virtuais: sobrecargaclass absoluto {
public:
int ab (int);
double ab (double);
};
int absoluto::ab(int val1) {
int temp;
temp = abs(val1);
return(temp);
}
double absoluto::ab (double val2) {
double temp;
temp = fabs(val2);
return(temp);
}
void main ( )
{
absoluto número;
cout << “O valor absoluto é “
<< numero.ab (-123)
<< endl;
cout << “O valor absoluto é “
<< numero.ab (-123.4567)
<< endl;
return;
}
Mar/97 Beauclair 90
Funções Virtuais: friend#include <stdio.h>
class teste
{
private:
int x;
public:
void set (int a) { x = a; }
friend void print (teste&);
};
void print (teste& v)
{
printf (“%d”, v.x); // friend
}
void main ( )
{
teste a;
a.set (10);
print (a);
}
Mar/97 Beauclair 91
Polimorfismo e Funções Virtuais: Exemplo
✔ Utilizaremos o seguinte esquema: #include <stdio.h>
class base
{
protected:
int dado;
public:
base (int a) { dado = a; };
virtual void print (char *msg)
{
printf(“base: %s e %d\n”, msg, dado);
}
};
drv1*
base*
drv2
drv3* drv4 drv5
Mar/97 Beauclair 92
Polimorfismo e Funções Virtuais: Exemplo
class drv1 : public base
{
public:
drv1 (int a) : base (a) { }
virtual void print (char *msg)
{ printf(“drv1: %s e %d\n”, msg, dado); }
};
class drv3 : public drv1
{
public:
drv3 (int a) : drv1 (a) { }
void print (char *msg)
{ printf(“drv3: %s e %d\n”, msg, dado); }
};
class drv2 : public base
{
public:
drv2 (int a) : base (a) { }
};
class drv4 : public drv1
{
public:
drv4 (int a) : drv1 (a) { }
};
class drv5 : public drv2
{
public:
drv5 (int a) : drv2 (a) { }
};
Mar/97 Beauclair 93
Polimorfismo e Funções Virtuais: Exemplo
void main ()
{
base b (1);
drv1 d1 (10);
drv2 d2 (100);
drv3 d3 (1000);
drv4 d4 (10000);
drv5 d5 (15000);
printf (“Objetos:\n”);
b.print (“objeto tipo base”);
d1.print (“objeto tipo drv1”);
d2.print (“objeto tipo drv2”);
d3.print (“objeto tipo drv3”);
d4.print (“objeto tipo drv4”);
d5.print (“objeto tipo drv5”);
}
Resultados do programa:
Objetos:
base: objeto tipo base e 1
drv1: objeto tipo drv1 e 10
base: objeto tipo drv2 e 100
drv3: objeto tipo drv3 e 1000
drv1: objeto tipo drv4 e 10000
base: objeto tipo drv5 e 15000
Parte 3
Metodologia de Desenvolvimento
de Programas Orientados a Objetos
Mar/97 Beauclair 95
Desenvolvimento de Programas OO
✔Diferença entre desenvolvimento deprogramação tradicional e OO
✔Abstração
✔Proteção dos dados
✔Construtores e Destrutores
✔Construção de métodos
✔Compilação em OOP
Mar/97 Beauclair 96
Diferença entre desenvolvimento comprogramação tradicional e com OO
Tradicional:
✔ visão de programação orientada à procedimentos
✔ o programa descreve uma série de passos a serem executados
OOP:
✔ visão de programação orientada a objetos
✔ o programa descreve um sistema de objetos interagindo
✔ conceito chave :
– abstração: processo de ignorar os detalhes, de forma a seconcentrar nas características essenciais
Mar/97 Beauclair 97
Tipos de AbstraçãoAbstração nos procedimentos:
– permite ignorar detalhes sobre os processos
– projeta-se o sistema em função de operações lógicas, ao invésde instruções específicas da linguagem de programação
Abstração nos dados:
– permite ignorar detalhes de como os dados são representados
– sempre envolvem algum grau de abstração nosprocedimentos
Mar/97 Beauclair 98
Abstração
Problema:
É possível declarar estruturas de dados sem sedeclarar as funções necessárias para se usá-las.As linguagens de programação tradicionaispermitem que se tenha abstração deprocedimentos e abstração de dados como duastécnicas distintas, quando de fato elas estãototalmente interligadas.
Mar/97 Beauclair 99
Abstração
Solução:
Uso da principal propriedade das classes:
– O usuário vê um objeto em termos dasoperações que podem ser realizadas, não emtermos da sua estrutura de dados.
Mar/97 Beauclair 100
Abstração em Linguagens OO
Linguagens OO combinam abstração de dados eabstração de procedimentos.
✔ Quando se define uma classe, descreve-se tudo sobre umaentidade de alto nível.
✔ Quando se usa um objeto desta classe, pode-se ignorar ostipos construídos contidos na classe e os procedimentosusados para manipulá-los.
Mar/97 Beauclair 101
Exemplo: polígonoDefinição:
– série de pontos, armazenados como uma série de paresde números.
No entanto, um polígono é mais que uma série de pontos. Umpolígono tem:
– perímetro, área e forma característica.
– pode-se querer mover, rodar, refletir, ...
– dado dois polígonos, pode-se querer achar as suasinterseções ou sua união, ou testar se são iguais.
Mar/97 Beauclair 102
Exemplo: estrutura tipo pilhaVamos supor que seja necessário que criemos uma estrutura
tipo pilha. Isto pode ser feito de várias maneiras, porémnem todas são eficientes quanto a integridade dos dados.
A maneira mais simples seria criando uma estrutura quecontivesse um vetor para os dados da pilha e uma variávelque fornecesse o local (índice) para inserir ou retirar umdado.
Para o acesso, seriam criadas as funções push para inserir epop para retirar. O usuário deveria criar uma variável dotipo pilha e utilizar as funções push e pop.
Mar/97 Beauclair 103
Exemplo: estrutura tipo pilha#include <stdio.h>
#include <stdlib.h>
#define MAX 100
/* Tipo Abstrato */
typedef struct _pilha {
int v[MAX];
int topo;
} Pilha;
/* Protótipos */
void push (Pilha *p, int dado);int pop (Pilha *p);
Mar/97 Beauclair 104
Exemplo: estrutura tipo pilhavoid push (Pilha *p, int dado)
{
if (p->topo >= MAX)
{
printf(“Pilha cheia.\n”);
exit(1);
}
p->v[p->topo] = dado;
p->topo++;
}
int pop (Pilha *p)
{
p->topo--;
if (p->topo < 0)
{
printf(“Pilha vazia.\n”);
exit(1);
}
return (p->v[p->topo]);
}
Mar/97 Beauclair 105
Exemplo: estrutura tipo pilhavoid main ( )
{
static Pilha p;
int i;
for (i = 0; i < 10; i++)
push (&p, i);
for (i = 0; i < 10; i++)
printf (“%d\n”, pop (&p));
}
Mar/97 Beauclair 106
Problema:Apesar de funcionar, esta é a pior forma possível em termos
de proteção de dados, pois nada impediria que alguém que“sabe o que está fazendo”, utilizasse instruções do tipo:
p.topo = 5; ou p.v[10] = 7;
ou algo pior.
Mar/97 Beauclair 107
Solução 1: Usando structA forma mais simples de classe em
C++ é a estrutura (struct).
Entretanto, a struct não possui, emprincípio, a proteção necessáriaaos dados.
Para exemplificar a criação de umaclasse usando struct, criaremos aseguir o tipo ou “classe”PILHA .
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX = 100;
struct PILHA
{
// dados
char v [MAX];
int topo;
Mar/97 Beauclair 108
Solução 1: Usando struct// operações (métodos)
void cria ()
{ topo = 0; }
void push (char c)
{
if (topo >= MAX)
{
printf(“Pilha cheia.\n”);
exit(1);
}
v [topo++] = c;
}
char pop ()
{
topo--;
if (topo < 0)
{
printf(“Pilha vazia.\n”);
exit(1);
}
return (v [topo] );
}
}; // fim da struct PILHA
Mar/97 Beauclair 109
Solução 1: Usando structvoid main ()
{
PILHA p1, p2;
static char str1[] =
{“Exemplo da classe PILHA”};
static char str2[] =
{ “Uma string qualquer”};
int i;
// coloca ponteiros no início
p1.cria ();
p2.cria ();
printf (“Strings originais:\n”);
printf (“%s\n”, str1);
printf (“%s\n”, str2);
// armazena primeira string
int tam1 = strlen(str1);
for (i = 0; i < tam1; i++)
p1.push (str1[i]);
// armazena segunda string
int tam2 = strlen(str2);
for (i = 0; i < tam2; i++)
p2.push (str2[i]);
Mar/97 Beauclair 110
Solução 1: Usando struct// retira strings
printf (“\nStrings invertidas:\n”);
for (i = 0; i < tam1; i++)
printf (“%c”, p1.pop());
printf(“\n”);
for (i = 0; i < tam2; i++)
printf (“%c”, p2.pop());
printf(“\n”);
}
Resultados do programa:
Strings originais:
Exemplo da classe PILHA
Uma string qualquer
Strings invertidas:
AHLIP essalc ad olpmexE
reuqlauq gnirts amU
Mar/97 Beauclair 111
public, private e protectedA palavra-chave public, indica que o acesso aos membros que
estiverem abaixo é livre, enquanto a private indica que elessão privados, somente podendo ser acessados pelosmétodos da classe. O protected indica que os dados sópodem ser acessados pelos métodos da classe e pormétodos de classes derivadas (herança). A diferençabásica entre private e protected é que se os membros foremdeclarados como protected, as classes derivadas poderãoutilizar estes membros com se fossem seus, o que nãoocorre quando estes forem declarados como private.
Mar/97 Beauclair 112
Solução 2: Usando classstruct PILHA
{
// dados
private:
char v [MAX];
int tam;
int topo;
// operações (métodos)
public:
void cria () { ... }
void push ( char c ) { ... }
int pop () { ... }
};
class PILHA
{
// dados
private:
char v [MAX];
int tam;
int topo;
// operações (métodos)
public:
void cria () { ... }
void push ( char c ) { ... }
int pop () { ... }
};
Mar/97 Beauclair 113
Construtores e DestrutoresSão métodos especiais das classes e possuem características
interessantes:
– o construtor tem o nome da sua classe e é ativadosempre que declararmos um objeto da classe.
– o destrutor tem o nome da classe com o caracter “~” nafrente e é ativado sempre que termina o escopo de umobjeto da classe.
Quando uma classe não possui estes métodos especiais,apenas é criada a área correspondente ao tamanho dosdados.
Mar/97 Beauclair 114
Construtores e Destrutores: Exemplo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAX = 1000;
class PILHA
{
private:
char *v;
int tam;
int topo;
public:
// construtor sem parâmetro
PILHA ()
{
printf(“Ativou Construtor 1\n”);
topo = 0;
tam = MAX;
v = new char[MAX];
}
// construtor com parâmetro
PILHA (int t)
{
printf(“Ativou Construtor 2\n”);
topo = 0;
tam = t;
v = new char[t];
}
Mar/97 Beauclair 115
Construtores e Destrutores: Exemplo~PILHA ()
{
printf (“Ativou destrutor\n”);
delete v;
}
void push (char c)
{
if (topo >= tam)
{
printf (“Pilha cheia.\n”);
exit (1);
}
v [topo++] = c;
}
char pop ()
{
topo--;
if (topo < 0)
{
printf(“Pilha vazia.\n”);
exit(1);
}
return (v[topo]);
}
};
Mar/97 Beauclair 116
Construtores e Destrutores: Exemplovoid main ()
{
PILHA p1, p2 (100);
static char str1[] =
{“Exemplo da classe PILHA”);
static char str2[] =
{“Uma string qualquer”};
printf (“Strings originais:\n”);
printf (“%s\n”, str1);
printf (“%s\n”, str2);
// armazena primeira string
int tam1 = strlen(str1);
for (i = 0; i < tam1; i++)
p1.push (str1[i]);
// armazena segunda string
int tam2 = strlen(str2);
for (i = 0; i < tam2; i++)
p2.push (str2[i]);
// retira strings
printf (“\nStrings invertidas:\n”);
for (i = 0; i < tam1; i++)
printf (“%c”, p1.pop());
printf(“\n”);
for (i = 0; i < tam2; i++)
printf (“%c”, p2.pop());
printf(“\n”);
}
Mar/97 Beauclair 117
Construtores e Destrutores: ExemploResultados do programa:
Ativou Construtor 1
Ativou Construtor 2
Strings originais:
Exemplo da classe PILHA
Uma string qualquer
Strings invertidas:
AHLIP essalc ad olpmexE
reuqlauq gnirts amU
Ativou destrutor
Ativou destrutor
Mar/97 Beauclair 118
Construção de métodosOs métodos que vimos até o momento são inline, isto é, não
são funções verdadeiras. Entretanto é útil que se separe adefinição da classe da sua implementação.
Desta forma, é possível se criar uma biblioteca de classes e ousuário necessitará apenas incluir o header de definição daclasse para a compilação e utilizar a biblioteca de classesdurante a link-edição.
A outra vantagem, é a possibilidade de proteger a classe deolhos alheios.
Mar/97 Beauclair 119
pilha.hpp#ifndef PILHA_HPP
#define PILHA_HPP
const int MAX = 1000;
class PILHA
{
private:
char *v;
int topo;
int MaxTam;
public:
// construtor sem parâmetros
PILHA ( );
// construtor com parâmetros
PILHA (int tam);
// destrutor
~PILHA ( );
void push (char c);
char pop ( );
};
#endif
Mar/97 Beauclair 120
pilha.cpp#include “pilha.hpp”
PILHA::PILHA ()
{
topo = 0;
v = new char[MAX];
MaxTam = MAX;
}
PILHA::PILHA (int tam)
{
topo = 0;
v = new char[tam];
MaxTam = tam;
}
PILHA::~PILHA ()
{
delete v;
}
void PILHA::push (char c)
{
if (topo >= MaxTam)
{
printf(“Pilha cheia.\n”);
exit(1);
}
v[topo++] = c;
}
char PILHA::pop () { topo --; if (topo < 0) { printf(“Pilha Vazia.\n”); exit(1); } return(v[topo]); }
Parte 4
Detalhamento da Metodologia
Mar/97 Beauclair 122
Metodologia de Programação OO
✔Identificação das classes
✔Determinação dos atributos e ações
✔Determinação dos relacionamentos
✔Determinação das hierarquias
Mar/97 Beauclair 123
Metodologia de Programação OO
Programação estruturada: Top-Down
– Especificar as funções do programa
• “O que este programa deve fazer ?”
• Definição das rotinas principais
• Detalhamento por refinamentos sucessivos
O programa é tratado como uma descrição de processos,que são divididos em sub-processos.
Mar/97 Beauclair 124
Metodologia de Programação OO
Visão Abstrata
Visão Detalhada
Mar/97 Beauclair 125
Metodologia de Programação OO
Programação OO:
– NÃO analise o programa em termos de processos outarefas;
– NÃO descreva-o pensando nas estruturas de dados;
– Analise o programa como um Sistema de ObjetosInteragindo.
O que são os objetos ?
Quais são as entidades ativas do programa ?
Mar/97 Beauclair 126
Metodologia de Programação OO
Visão AbstrataSuper Classe
Visão DetalhadaSub-Classes
ERRADO !top-down
Mar/97 Beauclair 127
Metodologia de Programação OO
Visão DetalhadaSub-Classes
Visão GlobalSuper Classe
ERRADO !bottom-up
Mar/97 Beauclair 128
Metodologia de Programação OO
Programação em OO envolve ambos os níveis de abstração,trabalhando com top-down e bottom-up.
Programação em OO envolve:
– Identificar as classes
– Determinar atributos e ações
– Determinar relacionamentos entre as classes
– Arrumar as classes em uma forma hierárquica
Mar/97 Beauclair 129
Metodologia de Programação OO
identificar asclasses
determinaratributos e ações
determinarrelacionamentos
determinarhierarquias
é um processo iterativo !
Mar/97 Beauclair 130
Identificação das Classes
Determinar as classes que um programa necessita émais difícil que identificar uma função principal.
Não se pode simplesmente fazer uma decomposiçãodos procedimentos do problema, esperando-seobter tipos estruturados ou estruturas de dadospara convertê-los em classes.
As classes tem que ser o princípio básico, asentidades ativas do programa.
Mar/97 Beauclair 131
Identificação das Classes✔ Uma boa técnica para identificação de classes é escrever
uma descrição dos propósitos do programa, listando todosos substantivos que aparecem na descrição e escolher asclasses desta lista.
O sucesso desta abordagem simples depende de como equão boa está a descrição escrita, mas pode dar boasidéias para os iniciantes em OO.
Mar/97 Beauclair 132
Identificação das Classes✔ Utilizar os modelos físicos dos objetos.
Exemplo 1: reserva de acentos em aviões
• classe aeronave
• classe passageiro
Exemplo 2: sistema operacional
• classe processos (programas, interrupções, etc.)
• classe dispositivos (discos, impressora, etc.)
Mar/97 Beauclair 133
Identificação das Classes✔ Utilizar as entidades conceituais que o programa irá
manipular.
Exemplos:
• programa de desenho– classe retângulo, classe círculo, ...
• compilador– classe sintaxe, ???
• sistema operacional– classe processos, classe dispositivos, ???
Mar/97 Beauclair 134
Identificação das Classes✔ Classes menos óbvias:
– Eventos
• fatos que podem acontecer com os objetos
– Interações
• fatos que podem acontecer entre os objetos
Exemplo: banco
classe transações para representar fatos comodepósitos, empréstimos, transferências, etc.
Mar/97 Beauclair 135
Determinação dos Atributos e Ações
✔ Determine as responsabilidades de cada classe.
– A informação que um objeto de cada classe tem quemanter.
O que um objeto desta classe tem que saber ?
– As operações que um objeto pode efetuar ou o que podeser feito com ele.
O que este objeto pode fazer ?
O que podemos fazer com este objeto ?
Mar/97 Beauclair 136
Determinação dos Atributos e Ações
Toda classe tem atributos. São as propriedades oucaracterísticas que a descrevem.
classe retângulo: altura e largura
classe cursor: forma
classe arquivo: nome, modo de acesso e posição
Importante: Não confundir atributos e classes. Não se devedefinir um classe para descrever um atributo.
Mar/97 Beauclair 137
Determinação dos Atributos e Ações
Toda classe tem um comportamento, que diz como um objetointerage com outros objetos (ações) e como seus atributosmudam durante esta interação.
– O fato de se determinar atributos e ações dão uma idéiaclara do que constitui uma classe útil.
– Ter o cuidado de não se criar classes que não fazemnada além do que “encapsular” processos.
– Determinar quais atributos vão ser guardados e quaisvão ser calculados quando necessários.
Mar/97 Beauclair 138
Determinação dos Relacionamentos
É uma extensão da etapa anterior (determinar ascaracterísticas de cada classe). Determinar como as classesvão usar outras classes.
Algumas classes podem existir independentemente, outrasnão. Algumas vezes, uma classe é depende de outra classepois não tem utilidade alguma, a menos que a outra classeexista. Isto é necessário quando uma classe executa umafunção membro de outra classe.
Uma classe pode estar “embutida” em outra classe,significando que contém objetos de outra classe.
Mar/97 Beauclair 139
Determinação dos Relacionamentos
Exemplos:
A classe Hora necessita de uma função que faça aconversão para um objeto string. Esta função chamauma função da classe String.
Um objeto círculo necessita de um objeto ponto pararepresentar o seu centro, da mesma forma que necessitade um número inteiro para representar o seu raio(composição).
Mar/97 Beauclair 140
Determinação de Hierarquias
É uma extensão da primeira etapa (identificação das classes)mas necessita da informação obtida durante as demaisetapas.
Exemplos:
– classe Conta_Bancária
• classe Conta_Corrente e classe Poupança
– classe Carro
• tipo de carro é um atributo e não uma classe
Mar/97 Beauclair 141
Composição e HerançaTanto composição como herança permitem que uma classe
use o código de outra classe.
Entretanto, composição deve ser usada quando a definição deuma classe tem outra classe, enquanto herança deve serusada quando uma classe é um tipo de outra classe.
– Um círculo não é um tipo de ponto; um círculo tem umponto para definir o seu centro.
– Um dado numérico não contém um dado genérico; umdado numérico é um tipo de dado.
Mar/97 Beauclair 142
Compilação em C++✔ Os programas em C++ podem ser gerados de duas formas:
✔ fonte C++ fonte C++
tradutor
fonte C
compilador
objeto
link
executável
Mar/97 Beauclair 143
Um Exemplo Completo
Because a user caninteract with onlyone window at atime, whetherscorlling or enteringtext, you need a wayto specify whichwindow receivesinput. That windowsis the active window.Olny one window
Because a user can interactwith only one window at atime, whether scorlling orentering text, you need a wayto specify which windowreceives input. That windowsis the active window. Olnyone window can be active atany given time.
Mar/97 Beauclair 144
Um Exemplo Completo✔ Identificação das classes
– uma classe óbvia: classe Win, onde cada window é umobjeto.
– uma classe para as interações com o usuário, tais comoteclado, mouse, etc. : classe Event, que passará aoobjeto win um objeto event, para realizar uma açãocorrespondente.
– uma classe candidata: classe WinMgr, para que se possadeterminar para qual objeto win um objeto event deveser enviado.
Mar/97 Beauclair 145
Um Exemplo Completo✔ Identificação das classes (continuação)
– como o programa irá manipular posições, é convenienterepresentá-las através de uma classe, ao invés de umpar de inteiros: classe Point
– o programa irá manipular janelas que terão a formaretangular. Assim, é razoável que também tenhamos aclasse Rect.
Mar/97 Beauclair 146
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto WinMgr
– guardar a posição dos objetos win
– manter uma ordem dos objetos win, através de umapilha, de forma que o objeto win que está no alto dapilha seja o objeto ativo
– refazer a pilha quando o usuário desejar que outroobjeto win seja ativado
Mar/97 Beauclair 147
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto WinMgr
– guardar a posição dos objetos win
– manter uma ordem dos objetos win, através de umapilha, de forma que o objeto win que está no alto dapilha seja o objeto ativo
– refazer a pilha quando o usuário desejar que outroobjeto win seja ativado
Mar/97 Beauclair 148
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto Win
– guardar a sua posição e tamanho
– guardar o texto que deve exibir, estando visível ouinvisível pelo uso de scroll-bars
– guardar a posição absoluta do texto exibido
– exibir o texto
– responder aos movimentos de cursor e mouse
Mar/97 Beauclair 149
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto Scroll-Bar
– guardar a sua posição e tamanho
– guardar a posição relativa do texto exibido
– exibir texto
– responder aos movimentos de cursor e mouse
Mar/97 Beauclair 150
Um Exemplo CompletoPode-se notar várias similaridades entre o objeto win e o
objeto scroll-bar: eles sabem seus tamanhos e posição,exibem informações e podem responder a interações com ousuário.
Ou seja, este comportamento comum aponta para a criação deuma classe base, fazendo com que as classes Win e Scroll-Bar sejam classes derivadas. Esta nova classe, representaráa área de interação com o usuário com uma entidadelógica.
Mar/97 Beauclair 151
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto Interactor
– guardar a sua posição e tamanho
– guardar a posição relativa do texto exibido
– exibir texto
– responder aos movimentos de cursor e mouse
Mar/97 Beauclair 152
Um Exemplo Completo✔ Determinação da hierarquia
Apesar de prematuro, já conseguimos determinar umahierarquia de classes. Falta verificar se esta hierarquia semanterá no decorrer do desenvolvimento.
Interactor
Scroll-Bar Win
Mar/97 Beauclair 153
Um Exemplo Completo✔ Determinação dos atributos e ações
Objeto Event
– determinar qual tecla foi pressionada (se teclado)
– determinar qual o estado dos botões e a posição domouse (se mouse)
– informar o que determinou
Mar/97 Beauclair 154
Um Exemplo Completo✔ Determinação da hierarquia
Uma vez que esta classe possui dois tipos que parecem nãoter nada em comum, é interessante derivá-las de umaclasse abstrata.
Event
Keyboard Mouse
Mar/97 Beauclair 155
Um Exemplo Completo✔ Determinação dos relacionamentos
Uma window pode ter, ou não, uma scroll-bar. Istorepresenta um relacionamento, onde uma windowcontém uma scroll-bar como um objeto membro. Win,consequentemente, usa scroll-bar.
A interação entre windows e scroll-bar requer duasformas de comunicação, uma vez que usando-se ascroll-bar afetamos a window e, movendo o cursor nawindow, afetamos a scroll-bar. Scroll-bar precisa saberda interface de win para se comunicar.
Mar/97 Beauclair 156
Um Exemplo Completo✔ Determinação dos relacionamentos (continuação)
Events são passados aos Interactors. Então, Interactortem que ter uma função membro capaz de receber umobjeto Event. Interactor usa Event.
WinMgr manipula objetos Win. Como podemos ter umnúmero arbitrário de Wins, não os podemos ter comoobjetos membro. Ao invés disso, faremos com queWinMgr consiga inserir ou deletar objetos Win.WinMgr também usa Event, que são então passadospara as Win.
Mar/97 Beauclair 157
Relacionamentos
contémusa
usa
contém comunica com
usa
WinMgr
Event Win
Scroll-Bar
Mar/97 Beauclair 158
Um Exemplo CompletoNeste momento, as hierarquias são muito simples, não
necessitando de nenhuma reestruturação.
Entretanto, é necessário decidir quais característicaspertencerão as classes bases e quais pertencerão as classesderivadas. Isto requer uma análise mais detalhada arespeito dos atributos e ações de cada classe. Para talanálise, inicia-se a definição das interfaces das classes, ouseja, o que será public, private ou protected.
Mar/97 Beauclair 159
classe Interactorclass Interactor
{
public:
int width ();
int height ();
Point origin ();
int withinBounds (Point pos);
virtual void paint () = 0;
virtual void handleEvent (Event &action) = 0;
protected:
Rect area;
};
Mar/97 Beauclair 160
classe Winclass Win : public Interactor
{ private:
public: ScrollBar *Hscroller;
int paint (); ScrollBar *Vscroller;
int handleEvent (Event &action); char *textBuffer;
void setchar (Point pos, char newchar); int textrows, textcolumns;
char retchar (Point pos); Point position;
void putstr (Point pos, char *newstr); Point cursorPos;
int rows (); char *title;
int columns (); };
void setTitle (char *newtitle);
Mar/97 Beauclair 161
classe Win: ProblemasÉ muita informação para somente uma classe.
É fácil notar que existem vários atributos que pertencem aotexto colocado na classe Win, não pertencendopropriamente ao objeto window.
– Dito isso, é interessante se criar uma nova classe queguarde o texto e incluí-la como membro da classe Win.
Mar/97 Beauclair 162
classe Winclass Win : public Interactor
{
public:
void paint ();
void handleEvent (Event &action);
void setTitle (char *newtitle);
private:
ScrollBar *Hscroller, *Vscroller;
Buffer canvas;
Point position; // Posição relativa do texto visível
Point cursorPos;
char *title;
};
Mar/97 Beauclair 163
classe Bufferclass Buffer
{
public:
int rows ();
int columns ();
Point origin ();
void setchar (Point pos, char *newchar);
char retchar (Point pos);
void putstr (Point pos, char *newstr);
private:
int width, length;
char *textArray;
};
Mar/97 Beauclair 164
classe ScrollBarclass ScrollBar : public Interactor
{
public:
void paint ();
void handleEvent (Event &action);
void setSlider (int pos);
private:
Win *parentWin;
int sliderPos;
int orientation; // Horizontal ou Vertical
};
Mar/97 Beauclair 165
classe WinMgrclass WinMgr
{
public:
void handleEvent (Event &action);
void addWindow (Win *newWindow);
void deleteWindow ();
void repaint();
private:
List winList; // classe já definida para manipulação de listas
};
Mar/97 Beauclair 166
classe Eventclass Event
{
public:
virtual EventType getType () = 0;
};
Uma vez que não existe nenhum tipo associado com o objetogenérico Event, a função getType é declarada como virtual.Cada classe derivada rescreve getType para retornar umaconstante de identificação.
Mar/97 Beauclair 167
classe KbdEventclass KbdEvent : public Event
{
public:
EventType getType () { return KBD_EVENT; }unsigned int val ();
private:
char ascii;
char scancode;
};
Mar/97 Beauclair 168
classe MouseEventclass MouseEvent : public Event
{
public:
EventType getType () { return MOUSE_EVENT; }Point getPosition ();
int getButton ();
private:
Point pos;
int buttons;
};
Mar/97 Beauclair 169
classe ScrollEventclass ScrollEvent : public Event
{
public:
EventType getType () { return SCROLL_EVENT; }int getDirection ();
int getDistance ();
ScrollBar *getSource ();
private:
int direction;
int distance;
ScrollBar *source;
};
Mar/97 Beauclair 170
Manipulação de Eventosvoid Win :: handleEvent (Event &action)
{
switch ( action.getType () )
{
case KBD_EVENT:
KbdEvent &keyAction = (KbdEvent &) action;
// executa o que for relativo à tecla pressionada
case MOUSE_EVENT:
MouseEvent &keyAction = (MouseEvent &) action;
// ...
case SCROLL_EVENT:
ScrollEvent &keyAction = (ScrollEvent &) action;
// ...
}
}
Mar/97 Beauclair 171
BibliografiaObject Orientation: Concepts, Languages, Databases and Interfaces
Setrag Khoshafian and Razmik Abnous
John Wiley & Sons, Inc. - 1990
An Introduction to Object-Oriented Programming an C++
Richard S. Wiener and Lewis J. Pinson
Addison-Wesley Publishing Company - 1988
Object-Oriented Environment in C++
David Hu
MIS Press - 1990
Mar/97 Beauclair 172
BibliografiaC++ Programming
John Thomas Berry
Howard W. Sams & Company - 1989
C++ Tutorial
Microsoft Group
Microsoft Corporation - 1991
Borland C++
Chris H. Pappas and William H. Murray
Makron Books - 1995