Muito obrigado pela ajuda maior_abandonado. Só tem um problema. Não podemos usar instanceof, pois segundo o professor vai contra a Orientaçao a Objetos. Como não aprendemos interface em sala de aula ainda, não sei se podemos usar. Vou perguntar pra ele na próxima aula.
Isto é desnecessario como ja disse anteriormente…
vc pode fazer um esquema mais ou menos assim:
class Porta {
private String tipo;
public boolean conectar(Dispositivo d) {
// Código para conectar na porta USB
if (d.getType().equals(this.tipo)){
//código que conecta
return true;
}else{
throw new IllegalArgumentException("dispositivo não permitido nessa porta");
}
public void desconectar() {
....
}
}
Porta não precisa ser uma superclasse que tera subclasses de tipos de porta…
pode ser uma unica classe que tera um tipo para definir qual tipo sera… se o que diferencia uma porta da outra é apenas o tipo e não a logica de implementação não a o pq ter uma hierarquia para ela…
Obrigado pela ajuda luistiagos, vamos ver se eu consigo resolver com sua dica.
[quote=luistiagos][code]
class Porta {
private String tipo;
public boolean conectar(Dispositivo d) {
// Código para conectar na porta USB
if (d.getType().equals(this.tipo)){
//código que conecta
return true;
}else{
throw new IllegalArgumentException("dispositivo não permitido nessa porta");
}
public void desconectar() {
....
}
}
[/code][/quote]
Evoluindo a idéia:
[code]// Substituindo as strings pelos enums.
public enum Tipo {
USB, PARALELO;
}
public class Porta {
private Tipo tipo;
// Uma porta pode conectar apenas um dispositivo, como diz o enunciado.
private Dispositivo dispositivo;
public Porta(Tipo t) {
this.tipo = tipo;
}
// Se o método dispara uma exceção, retornar um booleano é desnecessário.
public void conectar(Dispositivo d) {
if (this.tipo != d.getTipo()) {
throw new IllegalArgumentException("Dispositivo não permitido nesta porta.");
}
this.dispositivo = d;
}
public Dispositivo desconectar() {
Dispositivo result = this.dispositivo;
this.dispositivo = null;
return dispositivo;
}
}[/code]
Várias maneiras de resolver o mesmo problema.
[code]package computador;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Computador
{
Portas portasUSB;
Portas portasParalelo;
Portas paralelo()
{
return portasParalelo;
}
Portas USB()
{
return portasUSB;
}
public static void main(String[] args)
{
Computador pc = Computador.montarComputador();
Dispositivo p1 = new DispositivoParalelo();
pc.paralelo().conectar(p1);
pc.paralelo().desconectar(new DispositivoParalelo());
pc.paralelo().desconectar(p1);
pc.paralelo().conectar(new DispositivoParalelo());
Dispositivo usb1 = new DispositivoUSB();
Dispositivo usb2 = new DispositivoUSB();
Dispositivo usb3 = new DispositivoUSB();
pc.USB().conectar(usb1);
pc.USB().conectar(usb2);
pc.USB().conectar(usb3);
try
{
pc.USB().conectar(new DispositivoParalelo());
}
catch (IllegalArgumentException e)
{
System.out.println(e.getMessage());
}
}
public Computador(int nUSB, int nParalela)
{
portasUSB = new PortasUSB(nUSB);
portasParalelo = new PortasParalelo(nParalela);
}
public static Computador montarComputador()
{
Scanner in = new Scanner(System.in);
System.out.println("Quantas portas USBs?");
int nUSB = Integer.parseInt(in.nextLine());
System.out.println("Quantas portas Paralelas?");
int nParalela = Integer.parseInt(in.nextLine());
return new Computador(nUSB, nParalela);
}
}
class Portas
{
final int CAPACIDADE;
final List portas;
final TipoPorta tipo;
protected Portas(int capacidade, TipoPorta tipo)
{
this.CAPACIDADE = capacidade;
this.portas = new ArrayList(CAPACIDADE);
this.tipo = tipo;
}
public boolean conectar(Dispositivo d)
{
if (!this.tipo.equals(d.getTipo()))
throw new IllegalArgumentException("Tipo de porta inexperado. Esperado " + this.tipo + ", encontrado " + d);
if (portas.size() < CAPACIDADE)
{
System.out.println(d + " conectado");
return portas.add(d);
}
System.out.println("Não pode conectar " + d + ": Portas insuficientes.");
return false;
}
public boolean desconectar(Dispositivo d)
{
boolean b;
if (b = portas.remove(d))
System.out.println(d + " desconectado");
else
System.out.println("Não pode desconectar " + d + “: Dispositivo não encontrado”);
return b;
}
}
class PortasUSB extends Portas
{
public PortasUSB(int capacidade)
{
super(capacidade, TipoPorta.USB);
}
}
class PortasParalelo extends Portas
{
public PortasParalelo(int capacidade)
{
super(capacidade, TipoPorta.PARALELO);
}
}
abstract class Dispositivo
{
protected TipoPorta tipo = null;
protected Dispositivo()
{
}
public TipoPorta getTipo()
{
return tipo;
}
@Override
public String toString()
{
return "Dispositivo " + tipo + " " + hashCode();
}
}
class DispositivoUSB extends Dispositivo
{
public DispositivoUSB()
{
tipo = TipoPorta.USB;
}
}
class DispositivoParalelo extends Dispositivo
{
public DispositivoParalelo()
{
tipo = TipoPorta.PARALELO;
}
}
enum TipoPorta
{
USB, PARALELO
};
[/code]
Muito obrigado mesmo pessoal, nem sei como agradecer a ajuda.