You are on page 1of 5

UNIVERSIDADE FEDERAL DE SANTA CATARINA CENTRO TECNOLGICO

Departamento de Informtica e de Estatstica

Exerccios Lista 3 (Polimorfismo e Tratamento de Exceo)


Disciplina: INE 5605 - Desenvolvimento de Sistemas Orientados a Objetos I Professora: Carla Merkle Westphall
1.

Turma: 0238A

Considerando as interfaces definidas abaixo, implemente a classe Heri que implementa todas as interfaces. Os mtodos devem apenas escrever na tela o nome do mtodo. public interface PodeLutar { public interface PodeNadar { public interface PodeVoar { void luta(); } void nada(); } void voa(); }

2. A interface Pagamento definida da seguinte forma: public interface Pagamento { double getValor(); } Um funcionrio tem como atributos o nome (String), cpf (long) e valor do salrio (double). Um gerente um tipo de funcionrio no banco, mas possui tambm uma senha numrica (int) que permite o acesso ao sistema interno do banco. Todo fim de ano, os funcionrios do banco recebem uma bonificao. Os funcionrios comuns (da classe Funcionario) recebem 10% do valor do salrio como bonificao e os gerentes recebem 15%. A classe Funcionrio implementa (realiza) a interface Pagamento. A classe Gerente classe filha da classe Funcionrio. Suponha que os mtodos gets e sets da classe Funcionario e Gerente estejam implementados para cada um dos atributos das classes. Faa: a. Implemente as classes Funcionrio e Gerente. Voc deve descobrir o nome do mtodo que deve ser implementado e deve fazer a sua implementao. b. Implemente uma classe chamada ControleDeBonificacoes. O mtodo registra deve receber uma referncia de objeto de forma que o mtodo consiga somar ao atributo total a bonificao tanto de objeto do tipo Funcionrio quanto de objeto do tipo Gerente. Use polimorfismo para resolver este problema. c. Escreva um main Java que instancie um objeto ControleDeBonificacoes, dois objetos Funcionario, dois objetos Gerente, defina o salrio de cada objeto, invoque o mtodo registra para cada um dos objetos e escreva na tela o total de bonificaes a ser pago. Faa tambm um array no main que use o polimorfismo.
public class ControleDeBonificacoes { private double total = 0; public void registra( ?? total = total + ??; } ) { }

public double getTotalDeBonificacoes() { return total; }

3.

Assinale C (Certo) ou E (Errado) para as seguintes atribuies abaixo. Caso voc assinale E, explique o motivo.
1. Funcionario func1 = new Gerente(Ana Silva, 6581, 4500, 67452389); 2. Funcionario func2 = new Funcionario(Joao Souza, 6599, 4000);

-1-

3. 4. 5. 6. 7.

Gerente ger1 = Gerente ger2 = Pagamento pag1 Pagamento pag2 Pagamento pag3

func1; func2; = ger1; = func1; = new Pagamento();

4. (Verso um pouco modificada do exerccio da Lista 2) Um banco possui dois tipos de contas a conta corrente e a conta especial. O cliente da conta corrente possui apenas o valor do saldo disponvel para saque. J o cliente da conta especial tem um limite na sua conta que um valor que o banco disponibiliza tambm para saque. Por exemplo, um cliente especial tem R$ 400,00 de saldo, mas, por ser cliente da conta especial tem um limite de R$1000,00 fornecido pelo banco. Dessa forma o cliente especial tem a sua disposio para saque o valor total de R$1400,00. Entretanto, o saque no pode ultrapassar essa soma de saldo mais o limite, ou seja, no pode ser maior do que R$1400,00. Quando o cliente especial obtm o seu saldo, o valor obtido sempre considera o seu limite. No exemplo anterior, o valor do saldo seria R$ 1400,00 (R$400,00 na sua conta e mais R$1000,00 do limite). Considere o diagrama de classes UML abaixo que descreve transaes bancrias.

A interface Transacao definida da seguinte forma: public interface Transacao { boolean saque( double valor ); void deposito( double valor ); double getSaldo(); } A classe Conta uma classe abstrata que implementa a interface Transacao. Faa: a) Implemente as classes Conta, ContaCorrente, ContaEspecial e Cliente. Implemente os mtodos definidos no diagrama UML. b) No mtodo saque, sempre que o valor a ser sacado ultrapassar o saldo disponvel - no caso de ContaCorrente ou ultrapassar o valor da soma de saldo+limite - no caso da ContaEspecial, o mtodo deve retornar o valor false. c) Implemente os construtores das classes. Se for necessrio sobrescrever algum mtodo(s), este(s) mtodo(s) pode(m) ser implementado(s) tambm nas subclasses. d) Faa um programa principal (main Java) que realize as seguintes tarefas: -2-

1. 2. 3. 4.

Instanciar dois objetos ContaCorrente; Instanciar dois objetos ContaEspecial; Invocar o mtodo de saque de uma conta corrente; Instanciar um objeto Cliente que possui uma ContaCorrente e uma ContaEspecial. Deve ficar bem representado que este Cliente tem os dois tipos de conta; 5. Usando a referncia do objeto Cliente: invocar um mtodo para obter o saldo de uma das contas e invocar um mtodo para sacar um valor da sua ContaEspecial.

Usando polimorfismo faa as seguintes tarefas: 6. Invocar o mtodo getSaldo e escrever na tela o resultado; 7. Mostrar os dados (atributos) dos objetos instanciados; 8. Invocar o mtodo clone e equals usando o operador instanceOf e o downcast. 5. Modifique a classe Cliente do exerccio anterior de forma que essa classe implemente a interface Comparable do Java. Depois o main deve usar o mtodo para comparar dois clientes.

6. Modifique a classe TesteSistemaPagamento (exemplo 2 do arquivo de Fontes) para incluir a subclasse Empregado chamada FabricantePeca que representa um empregado cujo pagamento baseado no nmero de peas produzidas. A classe FabricantePeca deve conter os atributos private valorPeca (que representa o valor que o empregado recebe por pea fabricada) e pecas que representa o nmero de peas produzidas. Faa uma implementao concreta do mtodo salario na classe FabricantePeca que calcula o salrio do empregado multiplicando o nmero de peas fabricada pelo valor recebido por pea fabricada. Crie um array de variveis Empregado para armazenar referncias a objetos de cada classe concreta na nova hierarquia Empregado. Para cada Empregado no array, apresente sua representao em String e o seu salrio. 7. Uma classe abstrata ObjetoGeometrico representa um objeto geomtrico em duas dimenses. Essa classe deve ter como atributo as coordenadas (x,y) do ponto central onde est localizado o objeto em um espao bidimensional, e o nome do objeto (todos passados como argumento no construtor). Alm disso, esta classe deve conter os mtodos get e set apropriados (note que os valores das ordenadas e abscissas no podem ser negativas), alm dos mtodos abstratos para calcular e retornar a rea e o permetro do objeto. Ela deve tambm conter o mtodo toString que informe o nome do objeto e sua localizao. Usando classe abstrata ObjetoGeometrico como base, escreva as subclasses Circulo (contendo duas coordenadas para o centro e um raio passados tambm como argumentos no construtor), Retangulo (contendo dois valores para os lados) e Triangulo (contendo trs valores para os lados). Todas estas trs classes devem sobrescrever o mtodo toString de maneira a informar o tipo de objeto (Crculo, triangulo ou retngulo), seu nome e a sua localizao . Dicas: A rea de um crculo pode ser calculada com Math.PI*r*r, onde r o raio do crculo. O permetro de um crculo dado por 2*Math.PI*r. A rea do retngulo dada por b*h, onde b um dos lados e h o outro lado. Seu permetro dado por 2*b+2*h. A rea de um tringulo dada por Math.sqrt(s*(s-a)*(s-b)*(s-c)), onde Math.sqrt a funo que calcula a raiz quadrada, a, b e c so os lados do tringulo, e s a metade do permetro do tringulo. O permetro do tringulo calculado como (a+b+c). Implemente uma classe TesteObjetoGeometrico que cria um array de variveis ObjetoGeometrico para armazenar referncias a objetos de cada classe concreta na nova hierarquia ObjetoGeometrico (Circulo, Retngulo e Triangulo). Para cada ObjetoGeometrico no array, apresente sua representao em String, sua rea e permetro. -3-

8. Modifique a classe Crculo do exerccio anterior para que ela implemente a interface
Comparable. Em seguida desenvolva uma classe de teste (main Java) que leia dados de dois objetos Circulo, e indique se os crculos so iguais, ou se o primeiro menor ou maior que o segundo crculo. 9. Crie um programa que capture e propague a exceo para o mtodo main(). O mtodo de uma classe Interface que l um inteiro, por exemplo, pode gerar a exceo NumberFormatException, ao tentar converter um inteiro lido na janela usando o mtodo Integer.parseInt. O main deve capturar e tratar a exceo.

10. Considerando a classe Disciplina e a classe Aluno implementadas abaixo, escreva um main que faa o construtor da classe Disciplina lanar excees. Crie objetos disciplina at que o usurio queira encerrar o programa. Implemente blocos try... catch... finally no programa para capturar e tratar as excees. Se ocorrer excees o programa deve dar a chance de o usurio digitar novos dados para criar outra disciplina de forma correta. Tambm implemente o mtodo public void adicionaAluno(Aluno alu) na classe Disciplina que adiciona alu no array turma. Este mtodo deve lanar a exceo IndexOutOfBoundsException e essa exceo deve ser tratada no main.
public class Aluno { private String nome; private int matricula; public Aluno(String nome, int numMat){ this.nome = nome; matricula = numMat; } } public class Disciplina { private int codigo; private String nome; private int cargaHoraria; private Aluno[] turma; private static int quant; public Disciplina(int pCodigo, String pNome, int pCargaHoraria) throws Exception { setCodigo(pCodigo); setNome(pNome); setCargaHoraria(pCargaHoraria); turma = new Aluno[3]; quant = 0; // contador de objetos aluno guardadas no array turma } public void setCodigo(int pCodigo) { codigo = pCodigo; } }

public void setNome(String pNome) { nome = pNome;

public void setCargaHoraria(int pCargaHoraria) throws Exception { if ((pCargaHoraria < 30) || (pCargaHoraria > 110)) { throw new Exception("A carga horria deve estar entre 30 e 110 horas."); } cargaHoraria = pCargaHoraria; } public int getCodigo() { return codigo; public String getNome() { return nome; public int getCargaHoraria() { } } } }

return cargaHoraria;

-4-

11. Exerccios do Livro do Deitel, captulo 13, sexta edio.

-5-

You might also like