[RESOLVIDO]Dúvida gigante em POO e Herança

Galera, estou no início do meu curso em Java. Acabei de fazer uma prova que por sinal foi um fiasco só, se eu tirar 3 vai ser muito. :cry:

Pois bem, o problema segue abaixo(vou colar o código inteiro, mas minhas dúvidas são poucas):

  1. Uma empresa de eventos promove diferentes tipos de espetáculos. Para controlar os eventos e suas avaliações, está sendo desenvolvido um sistema com a seguinte estrutura de classes:
    ? A classe Evento é classe-base para a classe Show Musical, que é um tipo de evento promovido. Portanto, Show Musical herda as características de Evento.
    ? A classe Avaliação é parte da classe Evento(classe Evento possuí uma instancia de Avaliação).
    ? O método Mostra é implementado tanto na classe-base quanto na descendente. Cada uma responde a este método mostrando todos os dados que possui (herdados ou próprios).
    ? A interface ao usuário questionará se o evento a ser cadastrado é Qualquer ou Show Musical, para então criar o objeto correspondente.
    ? Ao final, imprimir todos os eventos cadastrados, com os dados da respectiva avaliação.

A classe Evento:

import javax.swing.JOptionPane;


public class Evento {
	
	private Avaliacao aval = new Avaliacao();
	
	private String titulo;
	private double valorIngresso;
	private int ano;
	private int mes;
	private int dia;
	
	public Avaliacao getAval() {
		return aval;
	}

	public void setAval(Avaliacao aval) {
		this.aval = aval;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public double getValorIngresso() {
		return valorIngresso;
	}

	public void setValorIngresso(double valorIngresso) {
		this.valorIngresso = valorIngresso;
	}

	public int getAno() {
		return ano;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}

	public int getMes() {
		return mes;
	}

	public void setMes(int mes) {
		this.mes = mes;
	}

	public int getDia() {
		return dia;
	}

	public void setDia(int dia) {
		this.dia = dia;
	}

                public void mostra() {
		JOptionPane.showMessageDialog(null, "Evento: "+titulo+
		"Valor do ingresso: "+valorIngresso+
		"Ocorre em: "+dia+"/"+mes+"/"+ano+
		"Opinião geral: "+aval.getOpiniaoGeral()+"."+" Quant. pagantes: "+aval.getQtdPagantes()+" pessoas.");
	}
}

A classe ShowMusical


public class ShowMusical extends Evento {
	
	private String nomeConjunto;
	private String tipoMusica;
		
	public String getNomeConjunto() {
		return nomeConjunto;
	}

	public void setNomeConjunto(String nomeConjunto) {
		this.nomeConjunto = nomeConjunto;
	}

	public String getTipoMusica() {
		return tipoMusica;
	}

	public void setTipoMusica(String tipoMusica) {
		this.tipoMusica = tipoMusica;
	}

	@Override
	public void mostra() {
		System.out.println("Evento: Show musical, com a banda "+nomeConjunto+" de "+tipoMusica+" ocorre em "+super.getDia()+"/"+super.getMes()+"/"+super.getAno()+"."+" Avaliação: "+super.getAval());
		}

}

A classe Avaliacao:


public class Avaliacao {
	
	private int qtdPagantes;
	private String opiniaoGeral;
	
	
	public int getQtdPagantes() {
		return qtdPagantes;
	}
	public void setQtdPagantes(int qtdPagantes) {
		this.qtdPagantes = qtdPagantes;
	}
	public String getOpiniaoGeral() {
		return opiniaoGeral;
	}
	public void setOpiniaoGeral(String opiniaoGeral) {
		this.opiniaoGeral = opiniaoGeral;
	}	

}

A interface para o usuario:

import javax.swing.JOptionPane;

public class InterfaceUsuario {
	
	private byte auxiliar;
	private Avaliacao avali = new Avaliacao();
	
	public void receberDados() {
		auxiliar = Byte.valueOf(JOptionPane.showInputDialog("Qual é o tipo de evento?\n 1 - Evento Geral\n 2 - Show Musical"));
		
		if (auxiliar == 1) 
			this.eventoNormal();
		else if (auxiliar == 2)
			this.eventoShow();
		else
			JOptionPane.showMessageDialog(null, "Opção inválida!");
			receberDados();
		}
	
	public void eventoNormal() {
		Evento evento = new Evento();
				
		evento.setTitulo(JOptionPane.showInputDialog("Qual o nome do evento?"));
		evento.setValorIngresso(Double.valueOf(JOptionPane.showInputDialog("Qual o valor do ingresso?")));
		evento.setDia(Integer.valueOf(JOptionPane.showInputDialog("Dia que ocorreu o evento?")));
		evento.setMes(Integer.valueOf(JOptionPane.showInputDialog("Mes em que ocorreu o evento?")));
		evento.setAno(Integer.valueOf(JOptionPane.showInputDialog("Ano em que ocorreu o evento?")));
		avali.setQtdPagantes(Integer.valueOf(JOptionPane.showInputDialog("Quantidade de pagantes?")));
		avali.setOpiniaoGeral(JOptionPane.showInputDialog("Opinião geral?"));
		menuPrincipal();
	}
	
	public void eventoShow() {
		ShowMusical showM = new ShowMusical();
		
		showM.setNomeConjunto(JOptionPane.showInputDialog("Qual o nome do conjunto musical?"));
		showM.setTipoMusica(JOptionPane.showInputDialog("Qual o estilo musical?"));	
		showM.setValorIngresso(Double.valueOf(JOptionPane.showInputDialog("Qual o valor do ingresso?")));
		showM.setDia(Integer.valueOf(JOptionPane.showInputDialog("Dia em que ocorreu o show?")));
		showM.setMes(Integer.valueOf(JOptionPane.showInputDialog("Mes em que ocorreu o show?")));
		showM.setAno(Integer.valueOf(JOptionPane.showInputDialog("Ano em que ocorreu o show?")));
		avali.setQtdPagantes(Integer.valueOf(JOptionPane.showInputDialog("Quantidade de pagantes?")));
		avali.setOpiniaoGeral(JOptionPane.showInputDialog("Opinião geral?"));
		menuPrincipal();
		
	}
	
	public void menuPrincipal() {
		Evento evento = new Evento();
		ShowMusical show = new ShowMusical();
		byte aux = 0;
		
		aux = Byte.valueOf(JOptionPane.showInputDialog("1 - Cadastrar evento\n 2 - Visualizar eventos gerais\n 3 - Visualizar shows musicais"));
		if (aux == 1) {
			aux = 0;
			receberDados();}
		else if (aux == 2) {
			aux = 0;
			evento.mostra();}
		else if (aux == 3){
			aux = 0;
			show.mostra();}
		else
			aux = 0;
			JOptionPane.showMessageDialog(null, "Opção inválida!!");
			menuPrincipal();			
	}

}

E uma classe Main, apenas pra conter o método main


public class Main {
	
	public static void main(String[] args) {
		InterfaceUsuario interfac = new InterfaceUsuario();
		
		interfac.menuPrincipal();
		
	}

}

Pois então, estou com dúvida em duas coisas:

1ª Fiz a parte de instanciar a classe Avaliacao na classe Evento?
2ª Minha parte de trabalhar com os objetos da classe Avaliação e atribuir valores aos atributos da classe avaliação estão errados, certo?

To meio sem noção nisso, não é algo que julgo difícil, mas meu trabalho tem me estressado muito, chego em casa sem vontade de fazer nada e acabou não estudando e exercitando o que vi nas aulas. Acho até que vou largar meu emprego de meio expediente pra me dedicar só a estes estudos.

:frowning:

Sim, você instancionou a classe Avaliação na classe evento.
Seria mais elegante fazer isso via construtor, mas pelo que vi,
vc ainda não deve ter chegado neste conceito ainda.

Uma dica: utilize o switch ao invez de if else if else… fica mais elegante para este
tipo de situação (menus etc)…

Veja bem, vc estancionou o objeto avaliação dentro da classe evento, certo? Então
pq vc esta criando outro objeto na classe InterfaceUsuario? Você deve fazer o get
desse objeto:

 evente.getAvaliacao();

e setar os atributos a partir desse objeto já instanciado.

evento.getAvaliacao().setQtdPagantes(Integer.valueOf(JOptionPane.showInputDialog("Quantidade de pagantes?")));  

Ou se preferir continuar com o objeto avali que vc criou na classe interface de usuario, vc tem que fazer o set depois…

evento.setAvaliacao(avali);

Lembrando que esta não é uma solução elegante e, neste caso vc nao terá problemas, mas por exemplo,
se vc fosse guardar todos os objetos de Evento para consultar depois (num array *vetor) e tal, vc teria problemas,
pois vc estaria utilizando o mesmo objeto (avali) para setar todos os outros objetos de evento… Ou seja,
a avaliação de todos os eventos seria a mesma. Isto acontece por que:

De uma lida aí, fala sobre String (ela é imutavel) e sobre referencia e passagem por valor…
acho que vai entender… Mas leia tudo! kkk

espero ajudar,
qqer coisa
posta ae

Boa noite…

Ah colegaa, deu pra entender um pouco mais sobre isso. Eu não estava sacando essa de que posso usar o próprio objeto e chamar os getters e setters referentes a classe dele…

Vou pedir mais dicas pra uns colegas da sala amanhã e outras dicas para o professor…

Não to curtindo muito o curso, o professor é novo, acho que a nossa é a segunda turma que ele dá aula. Ele ainda não sabe lecionar direito, acaba passando batido de alguns conceitos bem necessário(que ao menos eu julgo), e se atrapalha um pouco ao explicar o conteúdo. Mas vou continuar tentando, quero muito aprender Java!

:smiley:

Então,
vi que você é novo ao forum, então,
se você não tem mais dúvidas, coloque
[RESOLVIDO] antes no nome do tópico para que:
1) outras pessoas com a mesma dúvida possam visitar e se informar
2) pessoas que ajudam nao percam tempo lendo um post que já foi resolvido

beleza?
Qualquer coisa,
guj.com.br
:smiley:

abraços

Ok, obrigado pela dica!

:wink: