Dúvida sobre herançca

Estou fazendo o trabalho final de programação e me surgiu uma dúvida, nessa parte do enunciado:

[quote]Um computador suporta dois tipos de portas de comunicação: paralela e USB. Nessas portas podem se
conectar dispositivos de armazenamento, ou seja, unidades que contém arquivos.[/quote]

Cada uma dessas portas suporta tipos diferentes de dispositivos, mas tem métodos comuns como adicionaDisp(); e removeDisp();. Então criei uma classe Porta que é superclasse das classes de porta paralela e usb. Só que na hora de usá-la me surgiu uma dúvida: Eu uso uma coleção da classe Porta ou duas coleções(uma para cada tipo de porta)? Acho que a primeira seria o ideal, mas não sei como fazer daí =S

Não seria uma coleção de dispositivos? Dentro de cada dispositivo é que teria um atributo porta falando qual ele suporta.

Obrigado pela atenção Bruno Laturner.

Eu sou novato ainda, mas isso me parece errado… Afinal um computador tem portas e não dispositivos, certo?
Outra coisa que não me deixa fazer isso é que eu tenho que dizer quantas portas paralelas e quantas portas usb o computador terá assim que é iniciado.

ai depende de como esta instanciando os osbjeto…

assim?

Porta usb = new Usb(); Porta serial = new Serial();
ou

Usb usb = new Usb();

se for no primeiro caso vc pode fazer uma colecao só… se nao tem que ser duas coleçoes…

[quote=abelgomes]ai depende de como esta instanciando os osbjeto…

assim?

Porta usb = new Usb(); Porta serial = new Serial();
ou

Usb usb = new Usb();

se for no primeiro caso vc pode fazer uma colecao só… se nao tem que ser duas coleçoes…
[/quote]

Eu não comecei ainda, estou só pensando em como fazer. Mas o problema que encontro no primeiro modelo é assim:

Digamos que eu tenha o seguinte código:

portas.addAll(portasUSB); portas.addAll(portasParalelas);

Certo, agora eu tenho todas as portas dentro de uma coleção. Digamos que eu tenha adicionado 2 USB e 1 Paralela. Como eu faço para não deixar o usuário utilizar as 3 portas como USB/Paralelo?

Acho que daí na hora de pegar a porta usada tu verifica o tipo…

Eu faria com duas coleções mesmo.

E essas duas coleções continuariam herdando de porta né?

É.

A herança da porta tem que deixar. Porque existem métodos comuns aos 2 tipos de porta, com certeza.

acho que neste seu caso não necessita usar herança… pense no seguinte o que uma porta usb tem de diferente a uma porta serial? ambas são para transmição de dados correto? ou seja tem a mesma finalidade… porem tem particularidades como o seu conector por exemplo…
qual seria o nivel de detalhamento das portas nesta sua app? usaria uma tal forma de detalhamento por exemplo uma determinada caracteristica que uma porta tem e a outra não teria… ou alguma funcionalidade exclusiva de X tipo de porta que Y e Z seriam diferents… sendo assim justifica-se vc ultilizar herança porem se as funcionalidades e os atributos destas diferentes portas são o mesmos… se o que muda é o tipo de conector velocidade, etc… onde todas tem um tipo de conector, todas tem uma velociade X, todas tem atributos e funcionalidades iguais porem o que muda são os valores destes atributos (Ex: a velociade, o tipo de conector, etc…) então vc não precisa usar herança.
Para estes casos use uma classe Porta com seus devidos atributos e funcionalidades e com um atributo tipo da porta no qual vc indicara se éla é USB, Serial, LPT1, etc…

Olá Márcio,
O código dos métodos addDisp e removeDisp varia para cada tipo de porta? Caso positivo, uma sugestão alternativa seria fazer de Porta uma interface:

[code]public interface Porta {
// Um nome mais sugestivo do que addDisp
void conectar(Dispositivo d);
// Um nome mais sugestivo do que removeDisp
Dispositivo desconectar();
}

public PortaUSB implements Porta {
public void conectar(Dispositivo d) {
// Código para conectar na porta USB
}

public Dispositivo desconectar() {
    // Retorna o dispositivo USB desconectado
}

}

public PortaParalela implements Porta {
public void conectar(Dispositivo d) {
// Código para conectar na porta Paralela
}

public Dispositivo desconectar() {
    // Retorna o dispositivo desconectado
}

}[/code]
Assim, você mantém uma única coleção de portas, e passa os detalhes de cada porta para as implementações da interface Porta.
Abraços

A sugestão do luistiagos é bastante interessante. Os tipos das portas poderiam ser implementados com enums.

A diferença é basicamente o que você pode conectar em cada porta.

[quote]Para as portas paralelas existem os dispositivos de Hard Disk (HD), CD e DVD. Para as portas USB existem o HD Externo e Pen Drive. Nos HDs e Pen Drives podem-se armazenar dados diretamente na
unidade. Nos dispositivos de CD e DVD é necessário inserir uma mídia compatível com o dispositivo. As
mídias CD e DVD são lidas na unidade de DVD, porém, a unidade de CD consegue ler somente a mídia
CD.[/quote]

Pelo que vejo, as portas seriam identicas em tudo, menos no que suportam. Ou talvez herança não seja o melhor meio de resolver isso? Estou vendo agora que se implementar isso com herança terei problemas em fazer o CD e DVD não armazenarem arquivos =/

Você poderia postar o enunciado completo do exercício?

Eu considero a herança(o extends do Java em específico) como endeusada demais. Tem que pensar 10 vezes antes de usar ela.

Enunciado:

[quote]CENÁRIO

Um computador suporta dois tipos de portas de comunicação: paralela e USB. Nessas portas podem se
conectar dispositivos de armazenamento, ou seja, unidades que contém arquivos. O computador pode ter
uma quantidade qualquer dos dois tipos de portas. Mas uma porta pode estar ligada a somente um
dispositivo de armazenamento.

Para as portas paralelas existem os dispositivos de Hard Disk (HD), CD e DVD. Para as portas USB
existem o HD Externo e Pen Drive. Nos HDs e Pen Drives podem-se armazenar dados diretamente na
unidade. Nos dispositivos de CD e DVD é necessário inserir uma mídia compatível com o dispositivo. As
mídias CD e DVD são lidas na unidade de DVD, porém, a unidade de CD consegue ler somente a mídia
CD.

Podem ser colocados pastas e arquivos nos HDs, Pen Drive, e nas mídias de CD e DVD. Porém, eles têm
um limite de capacidade, ou seja, a soma do tamanho dos arquivos não pode exceder a capacidade do
dispositivo. Cada arquivo tem seu próprio tamanho, mas ocupa na unidade o seu tamanho mais a
quantidade de caracteres do seu nome. A definição de uma pasta ocupa 8 bytes mais a quantidade de
caracteres do seu nome.

Quando um dispositivo é conectado a um computador, ele ganha uma letra representando a sua unidade.
Pode ser solicitado ao computador para exibir todas as unidades. Também pode ser solicitado o conteúdo
(pastas e arquivos) para uma unidade.

DESCRIÇÃO

Crie uma aplicação de interface gráfica que represente esse computador. Ao criar um computador, precisa
especificar quais e quantos os tipos de portas. A aplicação precisa apresentar todas as unidades e seus
conteúdos.

A partir da aplicação, podem se criar dispositivos e mídias. Pode-se conectar e desconectar dispositivos, e
inserir as mídias em seus respectivos dispositivos.

A aplicação precisa permitir que se criem pastas e arquivos nas unidades. Não é necessário alterar e nem
excluir esses conteúdos. [/quote]

não que eu va ajudar muito no tópico, no assunto relativo mesmo, mais parei de ler no seu enunciado…

de onde vc tirou essa citação??? que eu saiba, os tipos são paralela e serial, usb é um tipo que possue caracteristicas de ambas…

ao menos uma coisa que diminui a chance de vc perder nota… confirma isso ai :wink:

[quote=maior_abandonado]não que eu va ajudar muito no tópico, no assunto relativo mesmo, mais parei de ler no seu enunciado…

de onde vc tirou essa citação??? que eu saiba, os tipos são paralela e serial, usb é um tipo que possue caracteristicas de ambas…

ao menos uma coisa que diminui a chance de vc perder nota… confirma isso ai ;)[/quote]

O enunciado é o oficial do professor. Provavelmente ele se enganou na hora de fazer hehe.

Interpretação faz parte do exercício.

Ele não fala que “computadores” possuem portas paralelas e usb. O exercício fala de um único computador em específico que tem portas paralela e USB. (Serial é antigão, ninguém mais vende :wink:

Interpretação faz parte do exercício.

Ele não fala que “computadores” possuem portas paralelas e usb. O exercício fala de um único computador em específico que tem portas paralela e USB. (Serial é antigão, ninguém mais vende ;)[/quote]

ta…a intenção era ajudar mesmo…achei que vc fosse entregar isso…

bom…de qualquer jeito eu vo tenta da meus 5 cents ao criador do tópico…

bom…somando ao que o tnaires falou, vc poderia cria uma classe computador…eu dexei um exemplo que eu acredito ser correto ai embaixo

[quote=marcio_gs]
Certo, agora eu tenho todas as portas dentro de uma coleção. Digamos que eu tenha adicionado 2 USB e 1 Paralela. Como eu faço para não deixar o usuário utilizar as 3 portas como USB/Paralelo?[/quote]

bom, se a sua duvida seria como verificar se o item adicionado no seu array, no seu list, ou seja la o q for é uma porta do tipo especifico, vc pode usar o operador instanceOf, para verificar se o objeto em questão é do tipo portaUSB ou do tipo portaParalela… veja o loop que eu fiz…

para não adicionar um dispositivo de tipo errado, vc pode coloca um metodo getTypePort no dispositivo, retornando porta paralela ou usb, ou o q for, uma string escrito o tipo por exemplo, e verificar isso no metodo conecta, se for do tipo diferente do da porta em que se tenta conectar, lance uma illegalArgumentException

veja o código abaixo:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package testes;

//código do cara ali atras

import java.util.ArrayList;
/**
*

  • @author flavio
    */
    class Computador {
    private final ArrayList portas;

    public Computador (ArrayList portas){
    this.portas = portas;
    }

    public Porta getPort(int index){
    return portas.get(index);
    }

}
public class User{
public static void main(String args[]){

    ArrayList<Porta> portas = new ArrayList<Porta>();

    portas.add(new PortaUSB());
    portas.add(new PortaParalela());
    portas.add(new PortaUSB());
    portas.add(new PortaParalela());
    portas.add(new PortaUSB());
    portas.add(new PortaParalela());
    portas.add(new PortaUSB());

    Computador c = new Computador(portas);

    
    for (int i=0;i<portas.size();i++){

        if (c.getPort(i) instanceof PortaUSB ){
            System.out.println("usb");
        }else if (c.getPort(i) instanceof PortaParalela){
            System.out.println("paralela");
        }else
            System.out.println("porta desconhecida");
    }

    //agora vamos conectar um dispositivo na porta correta e um não pra testar
    try{
        portas.get(0).conectar(new Dispositivo("USB"));
        System.out.println("chego aqui sem erros");
        portas.get(0).conectar(new Dispositivo("paralela"));
    }catch(IllegalArgumentException ile){
        System.out.println("caiu aqui");
        ile.printStackTrace();
    }

}

}

//código do tnaires, com algumas poucas modificações que eu aconselharia
interface Porta {
// Um nome mais sugestivo do que addDisp
boolean conectar(Dispositivo d);
// Um nome mais sugestivo do que removeDisp
boolean desconectar();
}

class PortaUSB implements Porta {
public boolean conectar(Dispositivo d) {
// Código para conectar na porta USB
if (d.getType().equals(“USB”)){
//código que conecta
return true;
}else{
throw new IllegalArgumentException(“dispositivo não permitido nessa porta”);
}

}

public boolean desconectar() {
    //esse jeito da esxceção poderia ser usado no conectar, bem como odo conectar aqui
    //a seu criterio
    try{
        //tenta desconectar
        return true;
    }catch(Exception e){//crie uma exception e coloque aqui
        return false;
    }
    
}

}

class PortaParalela implements Porta {
public boolean conectar(Dispositivo d) {
// idem a usb
return true;
}

public boolean desconectar() {
    // idem a usb
    return true;
}

}

class Dispositivo{
private String type;
public Dispositivo(String type){
this.type = type;
}
public String getType(){
return type;
}
}

[/code]

>