Вы находитесь на странице: 1из 172

Programao Orientada a Objetos

Roberto de Beauclair Seixas tron@lncc.br

Agenda
Nivelamento Histrico Caractersticas da OOP Terminologia
Definies e Exemplos

Desenvolvimentos de Programas OO Metodologia de Programao OO Estudo de Casos (Exerccios Orientados)


Mar/97 Beauclair 2

Parte 1
Conceitos bsicos

Nivelamento
Programa X Algoritmo X Implementao Tcnicas de Programao Abstrao X Implementao

Mar/97

Beauclair

Algoritmo X Implementao X Programa


O que so e quais as diferenas entre:
Algoritmo ? Implementao ? Programa ?

O que Metodologia ? E Metodologia de programao ?


Mar/97 Beauclair 5

Nivelamento
Tcnicas de Programao
Programao No-Estruturada Programao Procedimental (ou Procedural) Programao Estruturada (ou Modular) Programao Orientada Objetos
Modelo de Eventos Callbacks

Mar/97

Beauclair

Programao No-Estruturada
Programas simples e pequenos consistindo de apenas um programa principal.
Ex. Carto

Programa uma seqncia de comandos ou instrues que modificam dados globais durante toda a sua execuo.
Mar/97 Beauclair 7

Programao No-Estruturada
Program Main Program Data

Como melhorar este modelo de programao ? Extrao de seqncias (procedures)


Mar/97 Beauclair 8

Programao Procedimental
Um programa visto como uma seqncia de procedimentos que se comunicam atravs de dados locais, denominados parmetros. O fluxo destes dados pode ser ilustrado como um grafo hierrquico ou uma rvore.

Mar/97

Beauclair

Programao Procedimental
Main program procedure

Mar/97

Beauclair

10

Programao Procedimental
Main program Data

Procedure 1

Procedure 2

Procedure 3

Procedure 4
Mar/97 Beauclair 11

Programao Procedimental
Desta forma, temos um nico programa que dividido em pequenas partes, chamadas procedures. Para permitir o uso de procedimentos genricos ou grupo de procedimentos em outros programas, precisamos separ-los e disponibiliz-los. Grupo de procedures mdulos / estruturas
Mar/97 Beauclair 12

Programao Estruturada
Um programa no consiste mais de uma nica parte em um nico arquivo. agora dividido em vrias pequenas partes chamados mdulos, que interagem, atravs de chamadas aos procedimentos, formando o programa. Cada mdulo pode ter seus prprios dados. Isto permite que cada mdulo gerencie estruturas de dados internas, que so modificadas pelas chamadas aos procedimentos. Entretanto, s existe um estrutura por mdulo e cada mdulo s pode existir uma nica vez no programa.

Mar/97

Beauclair

13

Programao Estruturada
Main program Data

Module 1 Data + Data 1 Procedure 1

Module 2 Data + Data 2 Procedure 1 Procedure 2

Mar/97

Beauclair

14

Programao 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 ser caracterizadas pela sua estrutura e/ou pelos seus mtodos de acesso.

Mar/97

Beauclair

15

Programao Estruturada
dados dados dados dados

Problema: Implementar um mdulo genrico para manipulao de listas encadeadas.


Definio da interface (API)
o que est disponvel - deve esconder todos os aspectos de implementao.

Implementao
Mar/97 Beauclair 16

Programao 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 17

Programao 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 18

Programao Estruturada
Problema: E para se manipular mais de uma lista ?!?

Mar/97

Beauclair

19

Programao 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

20

Programao Estruturada
Agora, podemos criar objetos do tipo lista, cada um unicamente identificados por um handle, cujos procedimentos (mtodos) operam em funo deste handle. Mas ainda existem alguns problemas!

Mar/97

Beauclair

21

Programao Estruturada
Criao e Destruio Explcita
procedure foo () begin LIST_HANDLE my_list; my_list list_create (); /* do something with my_list */ list_destroy (my_list); end
Mar/97 Beauclair 22

Programao Estruturada
Ora, quando se usa variveis, no se precisa cri-las e destru-las. Ento, porque precisamos fazer isto com as listas ?
Procedure foo () begin LIST_HANDLE my_list; /* do something with my_list */ end
Mar/97 Beauclair 23

Programao Estruturada
No acoplar dados com operaes ! Mdulos so agrupados por operaes comuns, tais como as list_operations do exemplo anterior. Usa-se ento estas operaes, passandose os dados, explicitamente, como parmetros. Esta abordagem resulta numa estrutura orientada operaes. Podemos at dizer que as operaes especificam ou definem os dados a serem usados.
Mar/97 Beauclair 24

Programao Orientada a Objetos


Na Orientao a Objetos, a estrutura organizada pelos dados. Escolhe-se a representao dos dados que melhor se adequam aos requisitos do problema. Consequentemente, os programas ficam estruturados pelos dados e no pelas operaes. Isto significa que os dados apenas especificaro operaes vlidas. Agora os mdulos sero agrupados por dados e suas representaes, denominadas classes.
Mar/97 Beauclair 25

Programao 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); list_destroy (my_list); end
Mar/97 Beauclair

/* OOPS! */

26

Programao Estruturada
nossa responsabilidade assegurar que a lista consistente. Uma possvel soluo adicionar informaes a respeito do tipo de cada elemento da lista. No entanto, o que realmente queremos um mecanismo que nos permita especificar qual o tipo dos dados a ser manipulado na lista, mantendo as mesmas funes. Ou seja, uma lista que armazene nmeros, carros, maas ou pessoas, tem as mesmas operaes.
Mar/97 Beauclair 27

Programao Orientada a Objetos


Em OO existe o conceito de template, que casa as operaes com os dados. Exemplo:
LIST_HANDLE <cars> list1; LIST_HANDLE <people> list1; /* lista de carros */ /* lista de pessoas */

Mar/97

Beauclair

28

Programao Orientada a Objetos


Cada objeto implementaseus prprios mdulos e dados, permitindo que vrias estruturas coexistam. Cada objeto responsvel por inicializar e destruir os seus dados. Consequentemente, no existe mais a necessidade de explicitar uma chamada aos procedimentos de criao e destruio.
Mar/97 Beauclair 29

Programao Orientada a Objetos


Interao de Objetos
Objeto 2 Data Objeto 1 Data

Objeto 3 Data
Mar/97 Beauclair

Objeto 4 Data

30

Implementao de Tipos Abstratos


1 - int i, j, k; 2 - i = 1; 3 - j = 2; 4 - k = i + j;

Mar/97

Beauclair

31

Implementao de Tipos Abstratos


1 - int i, j, k;
Para cada instncia, uma operao inicial dever ser chamada (construtor). No exemplo, isto feito internamente pelo compilador, que reserva a memria necessria para o armazenamento de nmeros inteiros e o associa a um nome (binding). Assim, podemos nos referir a i significando uma rea da memria que guarda um valor de nmero inteiro que foi construda pela definio de i. Opcionamente, o compilador pode inicializar esta rea de memria, por exemplo, com o valor zero.
Mar/97 Beauclair 32

Implementao de Tipos Abstratos


2 - i = 1; 3 - j = 2;
Atribui o valor 1 a varivel i. Realiza a operao de atribuio do argumento 1 ao inteiro instanciado por i. Idem para j. Ou seja,

i.set(1); j.set(2);
Mar/97 Beauclair 33

Implementao de Tipos Abstratos


Dois nveis de representao:
Nvel dos tipos abstratos de dados:
Expressamos tudo que feito com uma instncia do tipo abstrato por chamadas a operaes pr-definidas.

Nvel de implementao:
Uma representao escolhida para a operao. Por exemplo, em C a implementao da operao set feita pelo smbolo =. Entretanto, em Pascal a implementao feita pelo smbolo :=.
Mar/97 Beauclair 34

Implementao de Tipos Abstratos


4 - k = i + j;

i.add(j); k.set(i.add(j));

Mar/97

Beauclair

35

Classe
a implementao (representao) de um tipo abstrato de dados. Define atributos e mtodos que implementam a estrutura de dados e as operaes dos tipos abstratos de dados, respectivamente. Consequentemente, as classes definem as propriedades e o comportamento dos conjuntos de objetos.
Mar/97 Beauclair 36

Classe
class Integer { // implementao da estrutura de dados atributos: int i; // operaes do tipo abstrato de dados mtodos: void setValue (int n); Integer addValue (Integer j); };
Mar/97 Beauclair 37

Objetos
Um objeto uma instncia de uma classe. Deve ser univocamente identificado pelo seu nome e definir um estado que representado pelos valores dos atributos ao longo do tempo. O estado dos objetos mudam de acordo com os mtodos que lhe so aplicados. Esta seqncia de trocas de estado definem o comportamento dos objetos. Assim, O comportamento de um objeto definido pelo conjunto de mtodos que podem ser utilizados.

Mar/97

Beauclair

38

Classes e Objetos
Dois grandes conceitos da Orientao por Objetos: Classes e Objetos. Programar Orientado por Objetos , portanto, a implementao de tipos abstratos de dados, ou, simplesmente, a definio de classes. Assim, em tempo de execuo, as instncias das classes, ou seja, os objetos, resolvem o problema pela troca dos seus estados. Conseqentemente, podemos pensar no programa como uma coleo de objetos. Mar/97 Beauclair 39

Pergunta:

Como estes objetos interagem ???

Mar/97

Beauclair

40

Mensagens
Um programa OO em execuo na verdade um repositrio em que objetos so criados, interagem entre si e ento so destrudos. Esta interao baseada em mensagens que so enviadas de um objeto para outro que indica qual mtodo deve ser aplicado.
Mar/97 Beauclair 41

Mensagens
Integer i; // define um novo objeto i.setValue(1); // atribui o valor 1 A mensagem aplique o mtodo setValue com o argumento 1 a si mesmo enviado ao objeto i. Note que enviar mensagem ao objeto i simplesmente representado por .. Assim, enviar mensagens aos objetos muito similar as chamadas de procedimentos da programao tradicional.

Mar/97

Beauclair

42

Mensagens
Entretanto, em OO existe uma viso de objetos autnomos que se comunicam pela troca de mensagens. Os objetos reagem quando recebem mensagens aplicando-se os mtodos. Uma mensagem uma solicitao para um objeto executar um de seus mtodos. A mensagem deve conter o nome e os argumentos do mtodo.

Mar/97

Beauclair

43

Exemplo

Como o computador exibe um caracter que voc digita ??

Mar/97

Beauclair

44

Procedimental
Wait until a key is pressed get a key value write key value at cursor position advance cursor position

Desta forma, fica difcil distinguir entidades que definiro as propriedades e os comportamentos.
Mar/97 Beauclair 45

Orientado por Objetos


Mensagem que indica que o estado deve ser trocado para pressionado Mensagem para exibir a imagem da tecla pressionada

Objeto tecla Mensagem com o cdigo da tecla pressionada


Mar/97 Beauclair

Objeto tela

46

Exerccios
Descreva as seguintes tarefas nas formas procedimental e na forma OO
ver TV comprar um refrigerante na cantina

Qual a diferena entre mensagem e chamadas a procedimentos ? Identifique os objetos e as mensagens no contexto da Internet.
Mar/97 Beauclair 47

Parte 2
Programao (bsica) Orientada a Objetos

Histrico
Linguagens de Programao OOP C++
Mar/97 Beauclair 49

Linguagens de Programao
linguagens de programao objetos ? classes ? herana ? concorrncia ? OOP concorrente
Mar/97 Beauclair 50

no no no no

linguagens convencionais linguagens com objetos linguagens com classes OOP

Histrico de OOP
1966 - Dahl & Nygaar 1972 - Kay 1978 - Ingalls 1983 - Goldberg & Robson 1985 - Stroustrup 1985 - Hewitt 1987 - Yonezawa & Tokoro Simula Smalltalk Smalltalk 80 C++ Actor Parallel OOP

Mar/97

Beauclair

51

Histrico de C++
Desenvolvida inicialmente por Bjarne Stroustrup na AT&T Bell Laboratories no incio dos anos 80. Primeira verso comercial 1985 Primeiras verses eram tradutores Concebida como extenso do C, mantm todas as facilidades da sua antecessora com o acrscimo da capacidade de permitir a programao orientada por objetos. O C++ pode ser utilizado como um C melhorado, uma linguagem orientada a objetos ou como uma juno das duas.

Mar/97

Beauclair

52

Relacionamento entre C e C++


CLASSES DERIVADAS

C CLASSES

C++

FRIEND FUNCTIONS

Mar/97

Beauclair

53

Caractersticas de OOP
Conceitos Programao Tradicional x OOP Ciclo de Vida do Software OOP
Mar/97 Beauclair 54

Conceitos da OOP
A programao orientada por objetos (OOP - Object Oriented Programming) baseia-se na construo de programas atravs da juno de abstraes de tipos. Um tipo abstrato composto por dados e pelas funes que podem atuar sobre estes dados.
Mar/97 Beauclair 55

Conceitos da OOP
A OOP permite a visualizao de conceitos como uma variedade de objetos. Pode-se representar a interao, as tarefas a serem executadas e quaisquer condies que devem ser observadas entre os objetos. As classes podem conter objetos intimamente relacionados que compartilham atributos. Uma classe define as propriedades e os atributos que descrevem as aes de um objeto pertencentes quela classe.
Mar/97 Beauclair 56

Programao tradicional versus OOP


Programao tradicional
subrotinas e funes formam o programa usurio das subrotinas deve conhecer estrutura de dados modificaes em uma subrotina podem alterar outras adaptao de subrotinas para atender a outros problemas semelhantes difcil manuteno

Mar/97

Beauclair

57

Programao tradicional versus OOP


OOP
programa formado pela juno de tipos abstratos no h necessidade do usurio saber a estrutura interna (dados) do tipo abstrato alterao interna de um tipo abstrato no altera outros fcil manuteno reusabilidade

Mar/97

Beauclair

58

Programao tradicional versus OOP


tipos abstratos operao que pode atuar sobre estes tipos ativar um mtodo classe objeto classe mtodo enviar mensagem dados + funes varivel de uma classe

Mar/97

Beauclair

59

Programao tradicional versus OOP


struct x dados funes varivel class x dados funes varivel

Em C++ os dados e as funes fazem parte da classe e esto intimamente ligados, o que no ocorre em C.
Mar/97 Beauclair 60

Ciclo de Vida de Software OO


modelo mundo real requisitos do usurio requisitos informais anlise dos requisitos modelo descritivo projeto e construo redes de classes abstrao e generalizao
Beauclair

biblioteca de componentes reutilizveis

modelo conceitual
Mar/97

61

Terminologia
Encapsulamento Hierarquia de classes Herana Polimorfismo Funes Virtuais
Definies e Exemplos

Mar/97

Beauclair

62

Encapsulamento
Encapsulamento diz respeiro a forma de definio dos objetos Em OOP, uma classe composta de vrias sees: PRIVADA: usada para definir a estrutura do tipo de dado; PBLICA: usada para as informaes de interface que tornam a classe reutilizvel dentro dos aplicativos; PROTEGIDA: usada para isolar os detalhes funcionais de objeto externo a classe.

Mar/97

Beauclair

63

Hierarquia de Classes
As classes servem como um padro para a criao de objetos. Os objetos so ocorrncias da classe. Pode-se desenvolver uma hierarquia de classe em que h uma classe-raiz e diversas subclasses ou classes derivadas. As classes-raiz representam as tarefas mais generalizadas enquanto as subclasses recebem tarefas mais especficas.
Mar/97 Beauclair 64

Herana
Classes derivadas (filhos) herdam todas as caracterstica de seus ancestrais (variveis e funes) e podem possuir suas prprias. Classes raiz ou base (pais) devem ser o mais genricas possveis, deixando para seus filhos o que for especfico. Com isto, possvel a criao de classes altamente sofisticadas sem grande esforo, j que boa parte do que elas devem fazer j foi feito por seus pais.
Mar/97 Beauclair 65

Herana: Vantagem
Permite um grande reaproveitamento de classes j existentes e testadas, tornando o desenvolvimento de programas mais fcil, mais rpido e mais confivel.

Mar/97

Beauclair

66

Herana simples
Novos tipos abstratos, ou classes, podem tambm ser criados a partir de outros j existentes.
FDQHWD WLQWHLUR SHQDGHDoR HVIHURJUiILFD

SHQDGHRXUR

Mar/97

Beauclair

67

Herana simples
conceitos
tipos abstratos de dados subtipos

classes

classe herana

implementao
Mar/97 Beauclair 68

Herana simples
X (classe base)
(herda de) parte derivada (herdada de X) parte incremental (cdigo novo especfico de Y)
Mar/97

Y (classe derivada)

Beauclair

69

Herana: Exemplo
Utilizaremos 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); } }; Beauclair 70

base deriv1 deriv2

Mar/97

Herana: Exemplo
class 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

71

Herana: Exemplo
void 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

72

Herana mltipla
Uma classe pode se tornar pai de outras classes e vrias classes podem compor uma nova classe.

c a rro

ba rc o

FDUURDQILELR

Mar/97

Beauclair

73

Herana mltipla: Exemplo


Usaremos o seguinte esquema:

soma

mult

subt

divi

calc

Mar/97

Beauclair

74

Herana mltipla: Exemplo


class 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); } }; Mar/97 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); } }; Beauclair 75

Herana mltipla: Exemplo


class 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 (); } Mar/97 void print () { printf (soma = %.2f\n, rso); printf (subt = %.2f\n, rsu); printf (mult = %.2f\n, rmu); printf (divi = %.2f\n, rdv); } };

Beauclair

76

Herana mltipla: Exemplo


void main ( ) { calc tudo (10, 2); tudo.exec ( ); tudo.print ( ); } Resultados do programa: soma subt mult divi = = = = 12.00 8.00 20.00 5.00

Mar/97

Beauclair

77

Herana mltipla: Problema


Como no temos um controle total sobre classes criadas por outras pessoas e, ainda assim, podemos us-las como classes base, pode ocorrer o seguinte problema: base

deriv1

deriv2

deriv3
Mar/97 Beauclair 78

Herana mltipla: Soluo


Pare evitar que sejam criadas vrias instncias da classe base, esta deve ser definida como virtual nas suas derivadas.
class class class class base { deriv1 deriv2 deriv3 ... }; : public : public : public { ...

virtual base { ... }; virtual base { ... }; deriv1, public deriv2 };

Mar/97

Beauclair

79

Ponteiros e herana
Quando temos uma classe base e vrias classes derivadas, um ponteiro da classe base pode receber como valor o endereo de qualquer uma de suas 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 80

Polimorfismo
a caracterstica pela qual uma nica mensagem pode ser enviada a todos os membros de uma famlia de classes (pais e seus filhos), cada um deles respondendo de uma forma particular mediante o seu prprio mtodo. O C++ utiliza polimorfismo atravs do uso de funes denominadas funes virtuais.
Mar/97 Beauclair 81

Polimorfismo: Exemplo
Para 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 mtodo Desenhe virtual, podemos ter: DESENHO *ptr_desenho; ... ptr_desenho.Desenhe(); Dependendo do objeto apontado no momento, o mtodo Desenhe responder de forma correta, mesmo que o tipo de desenho a ser feito seja diferente.

Mar/97

Beauclair

82

Herana 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

83

Herana com Polimorfismo: Exemplo


class 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

84

Herana com Polimorfismo: Exemplo


void 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 (); }; Mar/97 Beauclair 85 Resultados do programa: base: 1 base: 10 drv1: 20 base: 100 drv2: 200 base: 1000 drv3: 2000

Herana com Polimorfismo: Exemplo


E assim, como fica ?
base

drv1

drv3

drv2
Mar/97 Beauclair 86

Funes Virtuais
Esto intimamente associadas ao conceito de polimorfismo. As funes virtuais so definidas na classe-raiz quando as classes derivadas subseqentes sobrecarregam a funo redefinindo a sua implementao. So mtodos especiais de classes base pblicas e podem ser ativadas atravs de ponteiros ou referncias. A seleo e ativao de uma determinada funo virtual feita durante a execuo do programa e no em tempo de link-edio, como ocorre com funes normais.

Mar/97

Beauclair

87

Funes Virtuais
Uma das vantagens das classes a sua habilidade de esconder dados. Entretanto, as friend functions permitem o compartilhamento de informaes da classe privada com funes no-membro. As friend functions, que no so definidas na prpria classe, podem compartilhar os mesmos recursos de classe que as funes-membro, ao mesmo tempo que permanecem externas definio de classe.
Mar/97 Beauclair 88

Funes Virtuais: sobrecarga


class 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); } Mar/97 void main ( ) { absoluto nmero; cout << O valor absoluto << numero.ab (-123) << endl;

cout

<< O valor absoluto << numero.ab (-123.4567) << endl;

return; }

Beauclair

89

Funes 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); } void main ( ) { teste a; a.set (10); print (a); }

// friend

Mar/97

Beauclair

90

Polimorfismo e Funes 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); } };

base*

drv1*

drv2

drv3*

drv4

drv5

Mar/97

Beauclair

91

Polimorfismo e Funes 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) { } }; Beauclair 92

Mar/97

Polimorfismo e Funes 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); } Mar/97 Resultados do programa: Objetos: base: objeto drv1: objeto base: objeto drv3: objeto drv1: objeto base: objeto

tipo tipo tipo tipo tipo tipo

base drv1 drv2 drv3 drv4 drv5

e e e e e e

1 10 100 1000 10000 15000

Beauclair

93

Parte 3
Metodologia de Desenvolvimento de Programas Orientados a Objetos

Desenvolvimento de Programas OO
Diferena entre desenvolvimento de programao tradicional e OO Abstrao Proteo dos dados Construtores e Destrutores Construo de mtodos Compilao em OOP
Mar/97 Beauclair 95

Diferena entre desenvolvimento com programao tradicional e com OO


Tradicional: viso de programao orientada procedimentos o programa descreve uma srie de passos a serem executados OOP: viso de programao orientada a objetos o programa descreve um sistema de objetos interagindo conceito chave : abstrao: processo de ignorar os detalhes, de forma a se concentrar nas caractersticas essenciais

Mar/97

Beauclair

96

Tipos de Abstrao
Abstrao nos procedimentos: permite ignorar detalhes sobre os processos projeta-se o sistema em funo de operaes lgicas, ao invs de instrues especficas da linguagem de programao Abstrao nos dados: permite ignorar detalhes de como os dados so representados sempre envolvem algum grau de abstrao nos procedimentos

Mar/97

Beauclair

97

Abstrao
Problema: possvel declarar estruturas de dados sem se declarar as funes necessrias para se us-las. As linguagens de programao tradicionais permitem que se tenha abstrao de procedimentos e abstrao de dados como duas tcnicas distintas, quando de fato elas esto totalmente interligadas.

Mar/97

Beauclair

98

Abstrao
Soluo: Uso da principal propriedade das classes: O usurio v um objeto em termos das operaes que podem ser realizadas, no em termos da sua estrutura de dados.

Mar/97

Beauclair

99

Abstrao em Linguagens OO
Linguagens OO combinam abstrao de dados e abstrao de procedimentos.
Quando se define uma classe, descreve-se tudo sobre uma entidade de alto nvel. Quando se usa um objeto desta classe, pode-se ignorar os tipos construdos contidos na classe e os procedimentos usados para manipul-los.

Mar/97

Beauclair

100

Exemplo: polgono
Definio: srie de pontos, armazenados como uma srie de pares de nmeros. No entanto, um polgono mais que uma srie de pontos. Um polgono tem: permetro, rea e forma caracterstica. pode-se querer mover, rodar, refletir, ... dado dois polgonos, pode-se querer achar as suas intersees ou sua unio, ou testar se so iguais.
Mar/97 Beauclair 101

Exemplo: estrutura tipo pilha


Vamos supor que seja necessrio que criemos uma estrutura tipo pilha. Isto pode ser feito de vrias maneiras, porm nem todas so eficientes quanto a integridade dos dados. A maneira mais simples seria criando uma estrutura que contivesse um vetor para os dados da pilha e uma varivel que fornecesse o local (ndice) para inserir ou retirar um dado. Para o acesso, seriam criadas as funes push para inserir e pop para retirar. O usurio deveria criar uma varivel do tipo pilha e utilizar as funes push e pop.
Mar/97 Beauclair 102

Exemplo: estrutura tipo pilha


#include <stdio.h> #include <stdlib.h> #define MAX 100 /* Tipo Abstrato */ typedef struct _pilha { int v[MAX]; int topo; } Pilha; /* Prottipos */ void push (Pilha *p, int dado); int pop (Pilha *p);

Mar/97

Beauclair

103

Exemplo: estrutura tipo pilha


void 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

104

Exemplo: estrutura tipo pilha


void 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

105

Problema:
Apesar de funcionar, esta a pior forma possvel em termos de proteo de dados, pois nada impediria que algum que sabe o que est fazendo, utilizasse instrues do tipo: p.topo = 5; ou ou algo pior. p.v[10] = 7;

Mar/97

Beauclair

106

Soluo 1: Usando struct


A forma mais simples de classe em C++ a estrutura (struct). Entretanto, a struct no possui, em princpio, a proteo necessria aos dados. Para exemplificar a criao de uma classe usando struct, criaremos a seguir 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

107

Soluo 1: Usando struct


// operaes (mtodos) void cria () { topo = 0; } void push (char c) { if (topo >= MAX) { printf(Pilha cheia.\n); exit(1); } v [topo++] = c; }
Mar/97

char pop () { topo--; if (topo < 0) { printf(Pilha vazia.\n); exit(1); } return (v [topo] ); } }; // fim da struct PILHA
Beauclair 108

Soluo 1: Usando struct


void main () { PILHA p1, p2; static char str1[] = {Exemplo da classe PILHA}; static char str2[] = { Uma string qualquer}; int i; // coloca ponteiros no incio p1.cria (); p2.cria ();
Mar/97

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]);
Beauclair 109

Soluo 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

110

public, private e protected


A palavra-chave public, indica que o acesso aos membros que estiverem abaixo livre, enquanto a private indica que eles so privados, somente podendo ser acessados pelos mtodos da classe. O protected indica que os dados s podem ser acessados pelos mtodos da classe e por mtodos de classes derivadas (herana). A diferena bsica entre private e protected que se os membros forem declarados como protected, as classes derivadas podero utilizar estes membros com se fossem seus, o que no ocorre quando estes forem declarados como private.
Mar/97 Beauclair 111

Soluo 2: Usando class


struct PILHA { // dados private: char v [MAX]; int tam; int topo; // operaes (mtodos) public: void cria () { ... } void push ( char c ) { ... } int pop () { ... } };
Mar/97

class PILHA { // dados private: char v [MAX]; int tam; int topo; // operaes (mtodos) public: void cria () { ... } void push ( char c ) { ... } int pop () { ... } };
Beauclair 112

Construtores e Destrutores
So mtodos especiais das classes e possuem caractersticas interessantes: o construtor tem o nome da sua classe e ativado sempre que declararmos um objeto da classe. o destrutor tem o nome da classe com o caracter ~ na frente e ativado sempre que termina o escopo de um objeto da classe. Quando uma classe no possui estes mtodos especiais, apenas criada a rea correspondente ao tamanho dos dados.
Mar/97 Beauclair 113

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 parmetro PILHA () { printf(Ativou Construtor 1\n); topo = 0; tam = MAX; v = new char[MAX]; } // construtor com parmetro PILHA (int t) { printf(Ativou Construtor 2\n); topo = 0; tam = t; v = new char[t]; } Beauclair 114

Mar/97

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

115

Construtores e Destrutores: Exemplo


void 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]);
Mar/97

// 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); }

Beauclair

116

Construtores e Destrutores: Exemplo


Resultados 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 117

Construo de mtodos
Os mtodos que vimos at o momento so inline, isto , no so funes verdadeiras. Entretanto til que se separe a definio da classe da sua implementao. Desta forma, possvel se criar uma biblioteca de classes e o usurio necessitar apenas incluir o header de definio da classe para a compilao e utilizar a biblioteca de classes durante a link-edio. A outra vantagem, a possibilidade de proteger a classe de olhos alheios.

Mar/97

Beauclair

118

pilha.hpp
#ifndef PILHA_HPP #define PILHA_HPP const int MAX = 1000; class PILHA { private: char *v; int topo; int MaxTam; public: // construtor sem parmetros PILHA ( ); // construtor com parmetros PILHA (int tam); // destrutor ~PILHA ( ); void push (char c); char pop ( ); }; #endif
Beauclair 119

Mar/97

pilha.cpp
PILHA::~PILHA () #include pilha.hpp { PILHA::PILHA () delete v; { } topo = 0; v = new char[MAX]; void PILHA::push (char c) MaxTam = MAX; { } PILHA::PILHA (int tam) if (topo >= MaxTam) { { printf(Pilha cheia.\n); topo = 0; exit(1); v = new char[tam]; } MaxTam = tam; v[topo++] = c; } }
Mar/97 Beauclair

char PILHA::pop () { topo --; if (topo < 0) { printf(Pilha Vazia.\n); exit(1); } return(v[topo]); }

120

Parte 4
Detalhamento da Metodologia

Metodologia de Programao OO
Identificao das classes Determinao dos atributos e aes Determinao dos relacionamentos Determinao das hierarquias

Mar/97

Beauclair

122

Metodologia de Programao OO
Programao estruturada: Top-Down Especificar as funes do programa O que este programa deve fazer ? Definio das rotinas principais Detalhamento por refinamentos sucessivos O programa tratado como uma descrio de processos, que so divididos em sub-processos.
Mar/97 Beauclair 123

Metodologia de Programao OO
Viso Abstrata

Viso Detalhada

Mar/97

Beauclair

124

Metodologia de Programao OO
Programao OO: NO analise o programa em termos de processos ou tarefas; NO descreva-o pensando nas estruturas de dados; Analise o programa como um Sistema de Objetos Interagindo. O que so os objetos ? Quais so as entidades ativas do programa ?

Mar/97

Beauclair

125

Metodologia de Programao OO
ERRADO ! top-down Viso Abstrata Super Classe

Viso Detalhada Sub-Classes

Mar/97

Beauclair

126

Metodologia de Programao OO
ERRADO ! bottom-up Viso Detalhada Sub-Classes

Viso Global Super Classe

Mar/97

Beauclair

127

Metodologia de Programao OO
Programao em OO envolve ambos os nveis de abstrao, trabalhando com top-down e bottom-up. Programao em OO envolve: Identificar as classes Determinar atributos e aes Determinar relacionamentos entre as classes Arrumar as classes em uma forma hierrquica

Mar/97

Beauclair

128

Metodologia de Programao OO
identificar as classes

um processo iterativo !

determinar atributos e aes

determinar relacionamentos

determinar hierarquias
Mar/97 Beauclair 129

Identificao das Classes


Determinar as classes que um programa necessita mais difcil que identificar uma funo principal. No se pode simplesmente fazer uma decomposio dos procedimentos do problema, esperando-se obter tipos estruturados ou estruturas de dados para convert-los em classes. As classes tem que ser o princpio bsico, as entidades ativas do programa.
Mar/97 Beauclair 130

Identificao das Classes


Uma boa tcnica para identificao de classes escrever uma descrio dos propsitos do programa, listando todos os substantivos que aparecem na descrio e escolher as classes desta lista. O sucesso desta abordagem simples depende de como e quo boa est a descrio escrita, mas pode dar boas idias para os iniciantes em OO.

Mar/97

Beauclair

131

Identificao das Classes


Utilizar os modelos fsicos dos objetos. Exemplo 1: reserva de acentos em avies classe aeronave classe passageiro Exemplo 2: sistema operacional classe processos (programas, interrupes, etc.) classe dispositivos (discos, impressora, etc.)
Mar/97 Beauclair 132

Identificao das Classes


Utilizar as entidades conceituais que o programa ir manipular. Exemplos: programa de desenho
classe retngulo, classe crculo, ...

compilador
classe sintaxe, ???

sistema operacional
classe processos, classe dispositivos, ???
Mar/97 Beauclair 133

Identificao das Classes


Classes menos bvias: Eventos fatos que podem acontecer com os objetos Interaes fatos que podem acontecer entre os objetos Exemplo: banco classe transaes para representar fatos como depsitos, emprstimos, transferncias, etc.
Mar/97 Beauclair 134

Determinao dos Atributos e Aes


Determine as responsabilidades de cada classe. A informao que um objeto de cada classe tem que manter. O que um objeto desta classe tem que saber ? As operaes que um objeto pode efetuar ou o que pode ser feito com ele. O que este objeto pode fazer ? O que podemos fazer com este objeto ?

Mar/97

Beauclair

135

Determinao dos Atributos e Aes


Toda classe tem atributos. So as propriedades ou caractersticas que a descrevem. classe retngulo: altura e largura classe cursor: forma classe arquivo: nome, modo de acesso e posio Importante: No confundir atributos e classes. No se deve definir um classe para descrever um atributo.
Mar/97 Beauclair 136

Determinao dos Atributos e Aes


Toda classe tem um comportamento, que diz como um objeto interage com outros objetos (aes) e como seus atributos mudam durante esta interao. O fato de se determinar atributos e aes do uma idia clara do que constitui uma classe til. Ter o cuidado de no se criar classes que no fazem nada alm do que encapsular processos. Determinar quais atributos vo ser guardados e quais vo ser calculados quando necessrios.

Mar/97

Beauclair

137

Determinao dos Relacionamentos


uma extenso da etapa anterior (determinar as caractersticas de cada classe). Determinar como as classes vo usar outras classes. Algumas classes podem existir independentemente, outras no. Algumas vezes, uma classe depende de outra classe pois no tem utilidade alguma, a menos que a outra classe exista. Isto necessrio quando uma classe executa uma funo membro de outra classe. Uma classe pode estar embutida em outra classe, significando que contm objetos de outra classe.
Mar/97 Beauclair 138

Determinao dos Relacionamentos


Exemplos: A classe Hora necessita de uma funo que faa a converso para um objeto string. Esta funo chama uma funo da classe String. Um objeto crculo necessita de um objeto ponto para representar o seu centro, da mesma forma que necessita de um nmero inteiro para representar o seu raio (composio).

Mar/97

Beauclair

139

Determinao de Hierarquias
uma extenso da primeira etapa (identificao das classes) mas necessita da informao obtida durante as demais etapas. Exemplos: classe Conta_Bancria classe Conta_Corrente e classe Poupana classe Carro tipo de carro um atributo e no uma classe
Mar/97 Beauclair 140

Composio e Herana
Tanto composio como herana permitem que uma classe use o cdigo de outra classe. Entretanto, composio deve ser usada quando a definio de uma classe tem outra classe, enquanto herana deve ser usada quando uma classe um tipo de outra classe. Um crculo no um tipo de ponto; um crculo tem um ponto para definir o seu centro. Um dado numrico no contm um dado genrico; um dado numrico um tipo de dado.

Mar/97

Beauclair

141

Compilao em C++
Os programas em C++ podem ser gerados de duas formas:
fonte C++ tradutor fonte C compilador objeto link executvel fonte C++

Mar/97

Beauclair

142

Um Exemplo Completo
Because a user can interact with only one window at a time, whether scorlling or entering text, you need a way to specify which window receives input. That windows is the active window. Olny one window Because a user can interact with only one window at a time, whether scorlling or entering text, you need a way to specify which window receives input. That windows is the active window. Olny one window can be active at any given time.

Mar/97

Beauclair

143

Um Exemplo Completo
Identificao das classes uma classe bvia: classe Win, onde cada window um objeto. uma classe para as interaes com o usurio, tais como teclado, mouse, etc. : classe Event, que passar ao objeto win um objeto event, para realizar uma ao correspondente. uma classe candidata: classe WinMgr, para que se possa determinar para qual objeto win um objeto event deve ser enviado.
Mar/97 Beauclair 144

Um Exemplo Completo
Identificao das classes (continuao) como o programa ir manipular posies, conveniente represent-las atravs de uma classe, ao invs de um par de inteiros: classe Point o programa ir manipular janelas que tero a forma retangular. Assim, razovel que tambm tenhamos a classe Rect.

Mar/97

Beauclair

145

Um Exemplo Completo
Determinao dos atributos e aes Objeto WinMgr guardar a posio dos objetos win manter uma ordem dos objetos win, atravs de uma pilha, de forma que o objeto win que est no alto da pilha seja o objeto ativo refazer a pilha quando o usurio desejar que outro objeto win seja ativado

Mar/97

Beauclair

146

Um Exemplo Completo
Determinao dos atributos e aes Objeto WinMgr guardar a posio dos objetos win manter uma ordem dos objetos win, atravs de uma pilha, de forma que o objeto win que est no alto da pilha seja o objeto ativo refazer a pilha quando o usurio desejar que outro objeto win seja ativado

Mar/97

Beauclair

147

Um Exemplo Completo
Determinao dos atributos e aes Objeto Win guardar a sua posio e tamanho guardar o texto que deve exibir, estando visvel ou invisvel pelo uso de scroll-bars guardar a posio absoluta do texto exibido exibir o texto responder aos movimentos de cursor e mouse

Mar/97

Beauclair

148

Um Exemplo Completo
Determinao dos atributos e aes Objeto Scroll-Bar guardar a sua posio e tamanho guardar a posio relativa do texto exibido exibir texto responder aos movimentos de cursor e mouse

Mar/97

Beauclair

149

Um Exemplo Completo
Pode-se notar vrias similaridades entre o objeto win e o objeto scroll-bar: eles sabem seus tamanhos e posio, exibem informaes e podem responder a interaes com o usurio. Ou seja, este comportamento comum aponta para a criao de uma classe base, fazendo com que as classes Win e ScrollBar sejam classes derivadas. Esta nova classe, representar a rea de interao com o usurio com uma entidade lgica.
Mar/97 Beauclair 150

Um Exemplo Completo
Determinao dos atributos e aes Objeto Interactor guardar a sua posio e tamanho guardar a posio relativa do texto exibido exibir texto responder aos movimentos de cursor e mouse

Mar/97

Beauclair

151

Um Exemplo Completo
Determinao da hierarquia Apesar de prematuro, j conseguimos determinar uma hierarquia de classes. Falta verificar se esta hierarquia se manter no decorrer do desenvolvimento. Interactor

Scroll-Bar
Mar/97 Beauclair

Win
152

Um Exemplo Completo
Determinao dos atributos e aes Objeto Event determinar qual tecla foi pressionada (se teclado) determinar qual o estado dos botes e a posio do mouse (se mouse) informar o que determinou

Mar/97

Beauclair

153

Um Exemplo Completo
Determinao da hierarquia Uma vez que esta classe possui dois tipos que parecem no ter nada em comum, interessante deriv-las de uma classe abstrata. Event

Keyboard
Mar/97 Beauclair

Mouse
154

Um Exemplo Completo
Determinao dos relacionamentos Uma window pode ter, ou no, uma scroll-bar. Isto representa um relacionamento, onde uma window contm uma scroll-bar como um objeto membro. Win, consequentemente, usa scroll-bar. A interao entre windows e scroll-bar requer duas formas de comunicao, uma vez que usando-se a scroll-bar afetamos a window e, movendo o cursor na window, afetamos a scroll-bar. Scroll-bar precisa saber da interface de win para se comunicar.
Mar/97 Beauclair 155

Um Exemplo Completo
Determinao dos relacionamentos (continuao) Events so passados aos Interactors. Ento, Interactor tem que ter uma funo membro capaz de receber um objeto Event. Interactor usa Event. WinMgr manipula objetos Win. Como podemos ter um nmero arbitrrio de Wins, no os podemos ter como objetos membro. Ao invs disso, faremos com que WinMgr consiga inserir ou deletar objetos Win. WinMgr tambm usa Event, que so ento passados para as Win.
Mar/97 Beauclair 156

Relacionamentos
WinMgr
usa usa contm

Event

Win
contm comunica com

usa

Scroll-Bar
Mar/97 Beauclair 157

Um Exemplo Completo
Neste momento, as hierarquias so muito simples, no necessitando de nenhuma reestruturao. Entretanto, necessrio decidir quais caractersticas pertencero as classes bases e quais pertencero as classes derivadas. Isto requer uma anlise mais detalhada a respeito dos atributos e aes de cada classe. Para tal anlise, inicia-se a definio das interfaces das classes, ou seja, o que ser public, private ou protected.

Mar/97

Beauclair

158

classe Interactor
class 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 159

classe Win
class Win : public Interactor { public: int paint (); int handleEvent (Event &action); void setchar (Point pos, char newchar); char retchar (Point pos); void putstr (Point pos, char *newstr); int rows (); int columns (); void setTitle (char *newtitle); private: ScrollBar *Hscroller; ScrollBar *Vscroller; char *textBuffer; int textrows, textcolumns; Point position; Point cursorPos; char *title; };

Mar/97

Beauclair

160

classe Win: Problemas


muita informao para somente uma classe. fcil notar que existem vrios atributos que pertencem ao texto colocado na classe Win, no pertencendo propriamente ao objeto window. Dito isso, interessante se criar uma nova classe que guarde o texto e inclu-la como membro da classe Win.

Mar/97

Beauclair

161

classe Win
class Win : public Interactor { public: void paint (); void handleEvent (Event &action); void setTitle (char *newtitle); private: ScrollBar *Hscroller, *Vscroller; Buffer canvas; Point position; // Posio relativa do texto visvel Point cursorPos; char *title; };
Mar/97 Beauclair 162

classe Buffer
class 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 163

classe ScrollBar
class 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

164

classe WinMgr
class WinMgr { public: void handleEvent (Event &action); void addWindow (Win *newWindow); void deleteWindow (); void repaint(); private: List winList; // classe j definida para manipulao de listas };

Mar/97

Beauclair

165

classe Event
class Event { public: virtual EventType getType () = 0; };

Uma vez que no existe nenhum tipo associado com o objeto genrico Event, a funo getType declarada como virtual. Cada classe derivada rescreve getType para retornar uma constante de identificao.

Mar/97

Beauclair

166

classe KbdEvent
class KbdEvent : public Event { public: EventType getType () { return KBD_EVENT; } unsigned int val (); private: char ascii; char scancode; };

Mar/97

Beauclair

167

classe MouseEvent
class MouseEvent : public Event { public: EventType getType () { return MOUSE_EVENT; } Point getPosition (); int getButton (); private: Point pos; int buttons; };

Mar/97

Beauclair

168

classe ScrollEvent
class 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 169

Manipulao de Eventos
void 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 170

Bibliografia
Object 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 171

Bibliografia
C++ 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
Mar/97 Beauclair 172

Вам также может понравиться