Classes com composição e herança

4 respostas
J

Boa tarde, Pessoal.

Comecei a aprender java/POO agora e estou com diculdade em utilizar classes herdadas.

O cenário é o seguinte:
Tenho cinco classes no programa, a classe main (chamada Aplicacao), uma classe Disciplina, uma classe Didatico que compoem a classe Disciplina e duas classes que herdam de Didatico, chamadas de Trabalho e Modulo.

Abaixo os códigos:

public class Disciplina {
    // declaração dos atributos da classe
    private String codigo;
    private String nome;
    private int cargaHoraria;
    private Didatico [] didatico;

  public Disciplina(int qtdDidatico) {
        didatico = new Didatico[qtdDidatico];
    }

    public void setDidatico(Didatico didatico) {
        for (int i = 0; i < getDidatico().length; i++) {
            if (getDidatico()[i] == null) {
                this.didatico[i] = didatico;
                break;
            }
        }
    }


//demais metodos gets e sets ...
}


public class Didatico {
    private String codigoMaterial;
    private String dataMaterial;
    private String tipoMaterial;

    public Didatico() {
    }
//metodos gets e sets ...
}


public class Trabalho extends Didatico {
    private String enunciado;
    private String orientacao;
    private String complexidade;

    public Trabalho() {
    }
//metodos gets e sets ...
}


public class Modulo extends Didatico {
    private String titulo;
    private int qtdPagina;

    public Modulo() {
    }
//metodos gets e sets ...
}



public class Aplicacao {

    public static void main(String[] args) {

        Disciplina tempDisciplina = new Disciplina(4);//define a quantidade de material didatico por disciplina
        tempDisciplina.setNome("Programação Java");
        tempDisciplina.setCodigo("100.15");
        tempDisciplina.setCargaHoraria(60);

        Scanner entrada;
        entrada = new Scanner(System.in);
        String tipo;

        System.out.print("Digite o tipo do Material Didatico : ");
        tipo = entrada.nextLine();

O meu problema está quando vou instanticar a classe Disciplina, repare que no metodo construtor da classe instancio o atributo didatico do tipo Didatico, mas, eu nunca utilizo a classe Didatico e sim, as classes herdeiras, mas eu só sei qual classe herdar no momento da execução do código.

Por exemplo, quando o programa está sendo executado, depois de cadastrar os dados da disciplina, é solicitado informar qual o tipo do primeiro material, se for trabalho, deveria instanciar o atributo didatico como do tipo Trabalho e não do tipo Didatico como está no código.

Tentei fazer conforme abaixo, mas, não deu certo.

// continuação da classe Aplicacao

        if (tipo.equalsIgnoreCase("trabalho")) {
            Didatico tempTrabalho = new Trabalho();// não deu certo, não consigo acessar os metódos especificos da classe Trabalho
            tempTrabalho.setTipoMaterial(tipo);
            tempTrabalho.setCodigoMaterial("001T");
            tempTrabalho.setDataMaterial("01-09-12");
            tempTrabalho.setEnunciado("Herança POO");// erro, não é possível acessar o método setEnunciado
            tempTrabalho.setOrientacao("Entregar trabalho conforme normas da ABNT");// erro, não é possível acessar o método setOrientacao
            tempTrabalho.setComplexidade("media");// erro, não é possível acessar o método setComplexidade

            tempDisciplina.setDidatico(tempTrabalho);
        }

Tem como resolver esse problema, ou código não está bem escrito?

Obs.: Desculpem se tem algum termo errado, como disse, estou iniciando.

4 Respostas

luksrn

Caro,

resumidamente, o problema é que sua variável tempTrabalho é do tipo Didatico e como tal, essa variável só conhece os métodos e atributos da classe/interface Didatico. Se ela faz referência a uma instância de outro tipo, no caso Trabalho, ou Modulo, “não interessa”, só é possível acessar as operações definidas na classe/interface Didatico através de uma variável do tipo Didatico. Dê uma estudada melhor nos conceitos de Herança/interfaces e como ela se comporta em termos de sintaxe/comportamento que você tira isso de letra :slight_smile:

darkan666

como o luksrn disse “Dê uma estudada melhor nos conceitos de Herança/interfaces e como ela se comporta em termos de sintaxe/comportamento”… :wink:

pra acessar os métodos especificos da classe trabalho, vc teria que mudar de:

Didatico tempTrabalho = new Trabalho();

para:

Trabalho tempTrabalho = new Trabalho();

e se os seus contrutores (sem parâmetros) não vão ter nenhum conteudo, você pode deletalos, pois só estão ocupando
espaço no código… o java cria pra vc automaticamente …

J

luksrn:
Caro,

resumidamente, o problema é que sua variável tempTrabalho é do tipo Didatico e como tal, essa variável só conhece os métodos e atributos da classe/interface Didatico. Se ela faz referência a uma instância de outro tipo, no caso Trabalho, ou Modulo, “não interessa”, só é possível acessar as operações definidas na classe/interface Didatico através de uma variável do tipo Didatico. Dê uma estudada melhor nos conceitos de Herança/interfaces e como ela se comporta em termos de sintaxe/comportamento que você tira isso de letra :slight_smile:

luksrn,
Obrigado pela atenção, vou rever a implementação da herança, estou estudando a possibilidade de utilizar o conceito de factory method.

J

darkan666:
como o luksrn disse “Dê uma estudada melhor nos conceitos de Herança/interfaces e como ela se comporta em termos de sintaxe/comportamento”… :wink:

pra acessar os métodos especificos da classe trabalho, vc teria que mudar de:

Didatico tempTrabalho = new Trabalho();

para:

Trabalho tempTrabalho = new Trabalho();

e se os seus contrutores (sem parâmetros) não vão ter nenhum conteudo, você pode deletalos, pois só estão ocupando
espaço no código… o java cria pra vc automaticamente …

Oi darkan666,
Obrigado pela atenção, vou rever a hutilização de herença e estou estudando se seria necessário factory method. Em relação a método construtor sem parametro é uma exigência da atividade que estou fazendo.

Criado 22 de outubro de 2012
Ultima resposta 24 de out. de 2012
Respostas 4
Participantes 3