Dúvida sobre herançca

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.