Académique Documents
Professionnel Documents
Culture Documents
tipo de herana que usamos at agora chamado de herana simples pois cada classe herda de apenas uma outra. ? Existe tambm a chamada herana mltipla onde uma classe pode herdar de vrias classes.
Herana Mltipla
? Herana
mltipla no suportada por todas as linguagens OO. ? Esse tipo de herana apresenta um problema quando construmos hierarquias de classes onde uma classe herda duas ou mais vezes de uma mesma superclasse. O que, na prtica, torna-se um caso comum.
3
problema de herdar duas vezes de uma mesma classe vem do fato de existir uma herana de cdigo.
A
D
4
Compatibilidade de Tipos
Inmeras vezes, quando projetamos uma hierarquia de classes usando herana mltipla, estamos, na verdade, querendo declarar que a classe compatvel com as classes herdadas. Em muitos casos, a herana de cdigo no utilizada.
uso de classe abstrata para expressar compatibilidade impe a restrio sobre herana de classes.
abstract class ItemCompra { public abstract float obtemPreo(); } class Processador extends ItemCompra { public float obtemPreo(); }
Como definir uma classes Processador que um Equipamento e um Item de Compra ao mesmo tempo?
6
Interfaces
? Algumas
linguagens OO incorporam o conceito de duas classes serem compatveis atravs do uso de compatibilidade estrutural ou da implementao explcita do conceito de interface .
Em Java
? Java
no permite herana mltipla com herana de cdigo. ? Java implementa o conceito de interface. ? possvel herdar mltiplas interfaces. ? Em Java, uma classe estende uma outra classe e implementa zero ou mais interfaces. ? Para implementar uma interface em uma classe, usamos a palavra implements.
8
Exemplo de Interface
? Ao
implementarmos o TAD Pilha, poderamos ter criado uma interface que definisse o TAD e uma ou mais classes que a implementassem.
interface Stack { boolean isEmpty(); void push(int n); int pop(); int top(); }
9
Membros de Interfaces
? Uma
? Como
interface Stack { public abstract public abstract public abstract public abstract }
11
Pilha revisitada
class StackImpl implements Stack { private int[] data; private int top_index; StackImpl(int size) { data = new int[size]; top_index = -1; } public public public public }
12
boolean isEmpty() { return (top_index < 0); } void push(int n) { data[++top_index] = n; } int pop() { return data[top_index--]; } int top() { return data[top_index]; }
Resumindo Interfaces
? No
? Permite
if (x instanceof Comparable) {}
? Uma interface
Pacotes
14
das classes, Java prov um recurso adicional que ajuda a modularidade: o uso de pacotes. ? Um pacote um conjunto de classes e outros pacotes. ? Pacotes permitem a criao de espaos de nomes, alm de mecanismos de controle de acesso.
15
a princpio, possuem nomes. ? O nome do pacote qualifica os nomes de todas as classes e outros pacotes que o compem. ? Exemplo: classe Math.
int a = java.lang.Math.abs(-10); // a = 10;
16
Implementao de Pacotes
? Pacotes
so tipicamente implementados como diretrios. ? Os arquivos das classes pertencentes ao pacote devem ficar em seu diretrio. ? Hierarquias de pacotes so construdas atravs de hierarquias de diretrios.
17
18
Importao de Pacotes
? Podemos
usar o nome simples (no qualificado) de uma classe que pertena a um pacote se importarmos a classe. ? A importao de uma classe (ou classes de um pacote) pode ser feita no incio do arquivo, aps a declarao do pacote (se houver). ? As classes do pacote padro java.lang no precisam ser importadas (Ex.: Math).
19
Exemplo de Arquivo
package datatypes; // Stack pertence a datatypes. import java.math.*; // Importa todas as classes. import java.util.HashTable; // Importa HashTable. /* A partir desse ponto, posso usar o nome HashTable diretamente, ao invs de usar java.util.HashTable. Assim como posso usar diretamente o nome de qualquer classe que pertena ao pacote java.math. */ public class Stack { // Stack exportada. ... }
20
10
Controle de Acesso
21
Encapsulamento
? Na
classe Stack, ns encapsulamos a definio de pilha que desejvamos, porm, por falta de controle de acesso , possvel forar situaes nas quais a pilha no se comporta como desejado.
11
Controle de Acesso
? As
linguagens OO disponibilizam formas de controlar o acesso aos membros de uma classe. No mnimo, devemos poder fazer diferena entre o que pblico e o que privado. ? Membros pblicos podem ser acessados indiscriminadamente, enquanto os privados s podem ser acessados pela prpria classe.
23
Redefinio de Stack
class Stack { private int[] data; private int top_index; Stack(int size) { data = new int[size]; top_index = -1; } boolean isEmpty() { return (top_index < 0); } void push(int n) { data[++top_index] = n; } int pop() { return data[top_index--]; } int top() { return data[top_index]; } }
24
12
a nova implementao da pilha, o exemplo anterior no pode mais ser feito pois teremos um erro de compilao.
Stack s = new Stack(10); s.push(6); s.top_index = -1; // ERRO! A compilao pra aqui! System.out.println(s.isEmpty());
25
de membros pblicos e privados, temos tambm membros de pacote. ? Um membro de pacote s pode ser acessado por classes declaradas no mesmo pacote da classe que declara esse membro. ? Quando omitimos o modificador de controle de acesso, estamos dizendo que o membro de pacote.
26
13
27
vezes precisamos de um controle de acesso intermedirio: um membro que seja acessado somente nas sub-classes e nas classes declaradas no mesmo pacote. As linguagens OO tipicamente do suporte a esse tipo de acesso. ? Para isso usamos o modificador de controle de acesso protected em Java.
28
14
private : membros que so acessados somente pela prpria classe; protected: membros que so acessados pelas suas sub-classes e pelas classes do pacote; public : membros so acessados por qualquer classe; sem modificador ou default: membros que so acessados pelas classes do pacote.
29
Visibilidade de Membros
Pacote P1 A int i;
int i;
30
15
Visibilidade de Membros
Pacote P1 A int i; public int j;
Visibilidade de Membros
Pacote P1 A int i; public int j; protected int k;
16
Visibilidade de Membros
Pacote P1 A int i; public int j; protected int k; private int l;
Visibilidade de Membros
Pacote P1 A int i; public int j; protected int k; private int l; C Pacote P2 P1.A
17
Aninhamento de Classes
35
Aninhamento de Classes
? Em
diversas circunstncias precisamos criar classes cujo nico objetivo auxiliar na implementao de uma outra classe. Nesses casos, podemos declarar uma classe aninhada, ou seja, declarar uma nova classe como um membro de uma outra. ? Diversas linguagens OO suportam esse recurso.
36
18
Aninhamento em Java
? Java
37
Aninhamento Esttico
? Gera
classes e interfaces normais, cuja nica singularidade o nome, que passa a ser qualificado pelo nome da classe que as declara. ? Em particular, sendo um membro de uma classe, uma interface ou classe aninhada est sujeita aos modificadores de controle de acesso .
38
19
Aninhamento Dinmico
? Gera
classes associadas a objetos. ? Cada instncia da classe aninhada possui uma referncia para o objeto a partir do qual ela criada. ? Como ela est associada a um objeto, ela tem acesso a todos os membros desse objeto.
40
20
B void g() { i = 1; }
41
21