conceitos básicos de orientação a objetoscin.ufpe.br/~if669ec/aulas/aula01c++.pdf · paradigmas...
TRANSCRIPT
2
Tópicos da Aula
Aprenderemos fundamentos do paradigma orientado
a objetos, mas antes veremos o que é paradigma
Conceito de paradigma
Diferentes paradigmas na computação
Depois veremos o que é orientação a objetos
Conceitos de orientação a objetos
Programação orientada a objetos x Programação imperativa
Estrutura de um programa orientado a objetos em C++
Construtores
Criação de objetos
Exemplo de aplicação orientada a objetos
Paradigmas de Programação
Linguagens de programação são baseadas em
vários conceitos:
Tipos de dados, variáveis e armazenamento, controle,
abstração de dados, abstração procedural, sistema de
tipos,etc
Diferentes seleções dos conceitos definem o estilo
de programação ou Paradigma
Afeta a forma de pensar em como escrever um programa
A forma como estes conceitos são agrupados em
uma linguagem de programação definem que
paradigma é suportado por esta linguagem
Paradigmas de Programação
Podemos encontrar 6 grandes paradigmas suportados pelas linguagens de programação:
Imperativo
Uso de comandos, variáveis e procedimentos
Primeiras linguagens de programação são deste paradigma
Ex: Fortran, Pascal, C, etc
Orientação a Objetos
Uso de classes, objetos, herança, polimorfismo, maior abstração de dados, encapsulamento (implementação)
Evolução do paradigma imperativo
Ex: Smalltalk, C++, Eiffel, Java, C#, etc
Paradigmas de Programação
Funcional
Uso de expressões e funções, ausência de
variáveis e comandos
Ex: ML, Haskell
-- Exemplo em Haskell
-- type
factorial :: Integer -> Integer
-- using recursion
factorial 0 = 1
factorial n = n * factorial (n - 1)
Paradigmas de Programação
Lógico
Relações lógicas entre entradas e saídas,
asserções
Ex: Prolog, Mercury
/* Exemplo em Prolog */
mother_child(trude, sally). /* fato */
father_child(tom, sally).
father_child(tom, erica).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y). /* clausula*/
parent_child(X, Y) :- mother_child(X, Y).
?- sibling(sally, erica).
Yes
Paradigmas de Programação
Concorrente
Execução concorrente de processos, abstração de
controle de sincronização (inter-processos, acesso
a recursos, etc)
Ex: Occam, Java, Concurrent C, etc
Scripting
Sistema de tipos dinâmica, abstração de
processamento de Strings, suporte a interfaces
gráficas
Ex: Python, Java Script, Tcl
O que é Orientação a Objetos?
É considerar que tudo é um objeto:
Os sistemas são objetos
Os dados manipulados e comunicados entre os
sistemas são objetos
Cada parte de um sistema (sub-sistema) é um objeto
Os dispositivos eletrônicos são objetos
A interface com o usuário é um objeto, composto de
vários outros objetos...
8
Objeto
Podemos definir objeto como uma entidade
que possui:
Estado
Características ou propriedades do objeto
Comportamento
Operações que o objeto pode realizar
O comportamento pode examinar ou alterar o
estado de um objeto
9
Objeto DVD
Fonte: http://www.amazon.com
O estado atual do DVD; o que ele está fazendo...
As operações que o DVD pode executar
10
Comportamento Número Saldo
21.342-7 875,32
Crédito
Débito
Operações que uma conta pode executar
O estado atual da conta
11
Objeto Conta Bancária
Estados do Objeto Conta
Número Saldo
21.342-7 875,32
Crédito
Número Saldo
21.342-7 875,32
Crédito
Débito
Crédito(20)
12
Número Saldo
21.342-7 875,32
Crédito
Número Saldo
21.342-7 895,32
Crédito
Débito
Comportamento neste caso mudou o estado do
objeto conta
Classe
Classe é um agrupamento de objetos que têm
propriedades comuns e podem realizar as
mesmas operações
É uma definição que descreve como objetos
pertencentes à classe são estruturados
internamente (quais propriedades e operações
o objeto possui)
Classe é um conceito e o objeto é uma
instância deste conceito
Portanto, podemos ter vários objetos
pertencentes a mesma classe
13
Classe x Objeto
Número Saldo
21.342-7 875,32
Crédito
Número Saldo
11.056-x 1000,32
Crédito
Débito 14
Múltiplos objetos podem ser criados à partir da mesma
classe
Número Saldo
Crédito Débito
Número Saldo
21.342-7 875,32
Crédito
Número Saldo
875,32
Crédito
Débito
21.342-7
Classe Conta
Objeto conta1 Objeto conta2
Classe e Tipo
Tipo é um conjunto de valores relacionados que
são capazes de realizar as mesmas operações
Ex: inteiro, caractere, Conta, Banco, etc
Uma classe define um tipo: o tipo cujos
elementos são objetos com as mesmas
propriedades e comportamento
15
Atributo e Método (1)
Atributo representa alguma propriedade do
objeto
O conjunto de atributos de um objeto determina
o estado do objeto
Um atributo pode conter um valor simples tal
como um número real ou até outro objeto
Método representa uma operação que um
objeto pode fazer
O conjunto de métodos de um objeto determina
o comportamento do objeto
16
Número Saldo
21.342-7 875,32
Crédito
Débito
17
Atributo e Método (2)
Atributos da conta
Comportamento
Métodos de uma conta
Relações entre Objetos
Geralmente, um software é construído a partir de vários
objetos (classes) que se relacionam
As relações de Cliente e Herança são essenciais para
a construção de programas
Classe B é Cliente de classe A, se todo objeto de tipo B
contiver informação sobre um ou mais objetos do tipo A
Classe B é Herdeira de classe A, se B representa uma
versão especializada de A
Métodos e os atributos da classe A se tornam, também, parte
da classe B
Características e comportamento de A são passadas para B
18
Relação Cliente
Número Saldo
21.342-7 875,32
Crédito Cria nova Conta
Transferência
Objeto Banco1
19
Número Saldo
21.342-7 875,32
Crédito
Número Saldo
21.342-7 895,32
Crédito
Débito
Objeto do tipo Banco têm vários objetos do tipo
Conta Banco é cliente de Conta
Banco do Brasil
Nome
Conta1
Conta
Conta1
Conta
Conta1
Conta
Objeto Conta1
Relação Herança
20
Classe Poupança é uma versão especializada de Conta
Métodos e atributos são herdados
Classe Conta
Saldo
Crédito Débito
Número
Saldo
Crédito Débito
Número Juros
Classe Poupança
Utilizando OO para Desenvolver
Programas
Desenvolvimento de uma
solução se torna mais fácil
quando quebramos esta solução
em módulos gerenciáveis
Quando estamos programando,
podemos desenvolver módulos
separados, onde cada um é
responsável por uma certa parte
da solução
Programação Modular
OO facilita a programação
modular
Módulos são as classes e objetos 21
Algumas Considerações sobre OO
Orientação a Objetos Modularidade
Reusabilidade
Extensibilidade
Classe é uma entidade que combina 2 conceitos:
Módulo e Tipo
Módulo é um conceito sintático, pois a decomposição do
sistema em módulos afeta somente a forma como o programa
é escrito, não a funcionalidade dele
Tipo é um conceito semântico, pois o tipo influencia
diretamente a execução do sistema, definindo a forma dos
objetos que são criados e manipulados pelo sistema em tempo
de execução
22
OO e Linguagens de Programação
Linguagens OO têm em objetos e classes seus
elementos fundamentais para construção de programas
Estruturas da linguagem permitem mapeamento direto dos
conceitos de OO
Porém, é possível fazer um programa OO em uma
linguagem não OO
É possível, também, fazer um programa que não seja OO em
uma linguagem OO
23
Conceito de Orientação a Objetos é independente da linguagem de
programação
Linguagem C++
Criada por Bjarne Stroustrup em 1983
Pode ser vista quase como uma extensão da linguagem
C para dar suporte a OO
Embora quase tudo escrito em C seja compatível com C++,
certos comandos podem ter comportamento diferente em C++
Dá suporte a vários conceitos de OO:
Classe, Herança,Polimorfismo, Encapsulamento
Ainda oferece suporte a tratamento de exceções e tipos
genéricos
Sintaxe da linguagem Java foi inspirada em C++
24
Um Programa Imperativo...
Contém
Uma função principal, por onde começa a execução do programa
Várias funções auxiliares, para modularizar, dividir
o código em partes
Importação de bibliotecas de funções
Pode ainda conter:
Definição de tipos estruturados
26
Um Programa Orientado a Objetos ...
Tem a classe como a sua construção fundamental :
Um programa é constituído de uma ou mais classes
Que podem ter sido importadas de uma biblioteca de classes
Uma classe contém um ou mais atributos e métodos
Um método é composto de instruções
Ao Invés de Estruturas, Classes!
Define um tipo, com funções que
operam sobre este tipo
Estrutura
Função 1
Função 2
Função 3
Estrutura
Função 1
Função 2
Função 3
Classe
Programação Imperativa x
Programação OO
Programação Imperativa tem como elementos
principais os procedimentos (funções)
Programação OO tem como elementos
principais as classes
Estrutura + funções = classe
Programação OO ainda utiliza :
Herança
Encapsulamento
Polimorfismo
28
Veremos depois!
Implementando o Tipo Conta com
Programação Imperativa
Primeiro passo é definir um tipo estruturado
Conta
29
struct Conta{
double saldo;
char numero[11];
char agencia[11];
};
Implementando as Funções do Tipo
Conta
Depois se define as funções que operam sobre
o tipo Conta
creditar
debitar
getSaldo
criaConta 30
void creditar(struct Conta *c ,double v){
c->saldo = c->saldo + v;
}
Passa-se estrutura (ou endereço de estrutura) como parâmetro
Implementando as Funções do Tipo
Conta
31
void debitar(struct Conta *c,double v){
if (v <= c->saldo)
c->saldo = c->saldo - v;
}
double getSaldo(struct Conta *c){
return c->saldo;
}
Implementando as Funções do Tipo
Conta
32
struct Conta* criaConta(char *num, char* ag) {
struct Conta *retorno;
retorno = (struct Conta *)
malloc (sizeof(struct Conta));
if (retorno == NULL){
printf(“Erro na alocação de memória!”)
} else {
strcpy(retorno->numero, num);
strcpy(retorno->agencia, ag);
retorno->saldo = 0;
}
return retorno;
}
Alocando dinamicamente uma estrutura
Usando o Tipo Conta em Programação
Imperativa
33
int main() {
struct Conta *conta1;
conta1 = criaConta(“1234-5”,”007-x”);
if (conta1 == NULL){
printf(“Erro na alocação de memória!”)
} else {
creditar(conta1,300);
printf(“Saldo da conta = %lf\n”,getSaldo(conta1));
debitar(conta1,200);
printf(“Saldo da conta = %lf\n”,getSaldo(conta1));
}
return 0;
}
Implementando o Tipo Conta com
Programação OO (C++)
Primeiro passo é definir a classe Conta
Atributos e Métodos
34
class Conta{
private:
double saldo;
char numero[11];
char agencia[11];
public:
void creditar(double v);
void debitar(double v);
double getSaldo();
Conta(char* num, char* ag);
};
Atributos
Métodos
Construtor
Implementando os Métodos do Tipo
Conta
35
void Conta::creditar(double v){
saldo = saldo + v;
}
Indica que método faz parte da classe Conta
Não precisa passar objeto como parâmetro!
saldo é um atributo que foi definido na classe Conta
Implementando os Métodos do Tipo
Conta
36
void Conta::debitar(double v){
if (v <= saldo)
saldo = saldo - v;
}
double Conta::getSaldo(){
return saldo;
}
Construtor
Tipo especial de método que é chamado no ato de
criação de um objeto da classe desejada
Importante para fazer algumas inicializações no objeto
Uma classe pode ter mais de um construtor
O que diferencia um construtor do outro é a ordem e/ou tipo
e/ou quantidade de parâmetros
Em C++, deve ter o mesmo nome da classe
Não possui tipo de retorno
Não é obrigatório definir um construtor
Existe em C++ um construtor default sem parâmetros
37
Implementando o Construtor do Tipo
Conta
38
Conta::Conta(char *num, char* ag) {
strcpy(numero, num);
strcpy(agencia, ag);
saldo = 0;
}
Usando o Tipo Conta em Programação
OO
39
#include <iostream>
using namespace std;
int main() {
Conta *c;
c = new Conta(“1234-5”,”007-x”);
if (c == NULL){
printf(“Erro na criação do objeto!”)
} else {
c->creditar(300);
cout<<"Conta tem saldo = " << c->getSaldo() << endl;
c->debitar(200);
cout<<"Conta tem saldo = " << c->getSaldo() << endl;
}
return 0;
}
Comando para criar objeto de uma classe em tempo de execução (dinamicamente)
Para chamar método a partir de uma referência para um objeto
Para imprimir na tela
40
Criação Dinâmica de Objetos
Em linguagens OO, escrevemos programas
utilizando objetos
Mas, primeiro, temos que criá-los...
Para criar um objeto em C++ dinamicamente
utilizamos o comando new
new Conta(...);
Palavra reservada
ordenando a criação
de um objeto
Construtor do objeto a ser
criado
Avaliação do operador new
Cria um objeto da classe NomeDaClasse e
armazena na sua memória
Inicializa os atributos deste objeto usando o
construtor desta classe
Devolve como resultado da avaliação uma referência
(endereço da memória) para o objeto criado
Para avaliar uma expressão do tipo new NomeDaClasse();
o computador...
41
Criando um objeto dinamicamente...
new Conta(“12-3”,11-2”);
4. Devolve o endereço
como resultado da avaliação 42
1. Cria o objeto
na memória
2. Inicializa o
objeto
12-3 11-2
id275
3. Associa um
endereço ao
objeto
12-3 11-2
Construtores e new
new NomeDaClasse(argumentos)
O número, ordem e tipos dos argumentos
determina o construtor 43
Podemos ter mais de um construtor para um
determinado objeto
A escolha do construtor para inicializar os atributos é
determinada pela lista de argumentos, entre
parênteses
Referências para objetos
A referência funciona como a identidade do objeto
O objeto
id305
A referência para o objeto
44
Todo acesso e manipulação é feito indiretamente,
através de uma referência (endereço) para o objeto
Quando declaramos uma variável do tipo ponteiro
para um objeto, ela não armazena o objeto e sim
uma referência para um objeto daquele tipo
Conta* conta1 = new Conta(“12-3”,”11-2”);
conta1 armazena este valor
Referências e identidade de um objeto
id305
id309
id312
Objetos diferentes, mas com o mesmo conteúdo (clones)
Referências diferentes objetos diferentes 45
12-3 11-2
12-3 11-2
11-5 12-4
46
Considerações sobre Criação de
Objetos
Os valores dos atributos (estado) de um
objeto podem mudar durante a execução de
um programa, mas isso não afeta a
identidade do objeto
O ato de criar um objeto é chamado de
instanciar um objeto de uma determinada
classe
47
Criação Estática de Objetos
C++ permite também a criação estática (em tempo
de compilação) de objetos
No ato da declaração de uma variável do tipo de uma
classe, objeto é criado
Na declaração deve-se passar argumentos do construtor
Conta c(“12-3”,”11-2”);
Tipo da variável c é Conta
Argumentos do construtor
Usando Criação Estática de Objetos do
Tipo Conta
48
#include <iostream>
using namespace std;
int main() {
Conta c(“1234-5”,”007-x”);
c.creditar(300);
cout<<"Conta tem saldo = " << c.getSaldo() << endl;
c.debitar(200);
cout<<"Conta tem saldo = " << c.getSaldo() << endl;
return 0;
}
Declaração para instanciar objeto em tempo de compilação
Utiliza-se operador “.” para utilizar os métodos do objeto
criado estaticamente