Tipos compostos podem não ser suficientes
- \pause A linguagem permite operações sobre eles?
- \pause A linguagem faz validação e testes sobre eles?
- \pause Podem representar qualquer elemento do mundo real?
\pause Alternativa
- Encapsulamento de dados e suas operações
- \pause Permite definir Tipos Abstratos de Dados
- \pause Paradigma Orientado a Objetos
Compreendem
- Tipo de dado
- Conjunto de operações sobre o tipo
Escondem os mecanismos internos
Definidos pelo usuário
Elementos de primeira ordem
Exemplo?
- \pause Classe
Define como um objeto vai parecer e se comportar
Estado é representado por atributos (variáveis)
Operações são representadas por métodos (funções)
Parecido com uma \texttt{struct} em C
- Mas com os benefícios da orientação a objeto
struct pessoa { char nome[100]; int idade; float peso; void (*setPeso) (struct pessoa *p, float npeso); void (*setIdade) (struct pessoa *p, int nidade); float (*getPeso) (struct pessoa *p); int (*getIdade) (struct pessoa *p); };
Instância de uma classe
Uma cópia construída a partir da classe
\small
class Pessoa {
std::string nome;
int idade;
float peso;
Pessoa ();
~Pessoa ();
std::string getNome ();
int getIdade ();
float getPeso ();
void setNome (std::string nnome);
void setIdade (int nidade);
void setPeso (float npeso);
};
\small
@interface Pessoa : NSObject
{
NSString *nome;
int idade;
float peso;
}
- (id) init;
- (void) dealloc;
- (NSString*) getNome;
- (int) getIdade;
- (float) getPeso;
- (void) setNome: (NSString*) nnome;
- (void) setIdade: (int) nidade;
- (void) setPeso: (float) npeso;
@end
Interface visível e consistente
Detalhes de implementação escondidos
\pause Contraponto com tipos primitivos
Controle de acesso aos atributos
Níveis de visibilidade
- Públicos – por todo mundo
- Protegidos – na classe e subclasses
- Privados – na classe
Utilizando \texttt{struct} em C++ \small
struct Pessoa {
std::string nome;
int idade;
float peso;
Pessoa();
};
Utilizando \texttt{class} em C++ \small
class Pessoa {
public:
std::string nome;
protected:
int idade;
private:
float peso;
public:
Pessoa();
~Pessoa();
};
Objective-C \small
@interface Pessoa : NSObject
{
@public
NSString *nome;
@private
int idade;
float peso;
@protected
NSString *sobrenome;
}
- (id) init;
- (void) dealloc;
...
@end
Construtor
- Faz a inicialização da instância da classe
\pause Java, C++
- Sempre tem o mesmo nome da classe
- Sempre é chamado quando um objeto é instanciado
\pause Objective-C
- Existem diferentes formas de funcionamento
\pause Destrutor
- Chamado quando o objeto é destruído (liberado)
\pause C++
- Nome da classe antecedido por ~
\pause Objective-C
- Método \texttt{dealoc} é chamado pelo ambiente de execução
Definir uma classe a partir de outra (classe pai)
A classe filha herda todos os atributos e métodos do pai
Exemplo em Objective-C \small
@interface VeiculoTerrestre : Veiculo
{
float velocidadeMaxima;
...
}
...
@end
Exemplo em Smalltalk
Veiculo subclass: #VeiculoTerrestre
instanceVariableNames: 'velocidadeMaxima '
category: 'OnSmalltalk'