Diferenciar Eventos que herdam atributos utilizando classe abstrata

2 respostas
F_ix1

Olá pessoal estou com um problema que não entendi muito bem!

é o seguinte, estou fazendo uma agenda que vai interagir com duas classes (ANIVESARIO E REUNIÂO)

Ambas (REUNIÃO E ANIVERSARIO) recebem atributos por herança de uma classe abstrata chamada EVENTO.

o meu problema principal é em uma função chamada "add" na classe agenda que nela terei que perguntar ao usuario se o EVENTO é um aniversario ou reunião.

[img]http://img94.imageshack.us/img94/133/semttulouti.png[/img]

tenho um vetor de objeto do tipo EVENTO e nessa função add preciso saber de qual tipo vou declarar ele (ANIVERSARIO ou REUNIÃO).

bom não consigo fazer isso ja que evento é uma classe abstrada e não entendi como isso funciona alguem poderia me dar algum exemplo?

para ajuda postarei minha classe "AGENDA" (que é a prinicipal) para analise (está incompleta)

import javax.swing.JOptionPane;
public class Agenda extends Evento {
    //varaiveis
    private int maxEventos;
    private int controle;
    public int getMaxEventos() {return maxEventos;}
    public void setMaxEventos(int maxEventos) {this.maxEventos = maxEventos;}    
    //vetor objeto
    Evento eventos[] = new Evento[maxEventos];    
    
    
    //construtores
    public Agenda(){}
    public Agenda(int maxEventos){
        this.maxEventos = maxEventos;
        System.out.print("Construtor sucess!!");
    };
    //metodos
    public boolean add(){
        if(controle == maxEventos || controle >= maxEventos){
            JOptionPane.showMessageDialog(null, "Infelizmente não se pode marcar mais evento \n Agenda full");
            return false;
        }
        else {
            int qualevento;
            qualevento = Integer.parseInt(JOptionPane.showInputDialog(null, "QUAL É O EVENTO?\n  Digite 1 para marcar Reuião \n Digite 2 para marcar Aniversario"));
            if(qualevento == 1){


            }
            else {

            }
            controle = controle + 1;
            return true;
        }
    }
    public boolean completa(){
        if(1==1){return false;}
        else {return true;}
        
    }
}

para explicar melhor o que EU ENTENDI (posso ter entendido errado)

seria para transformar um espaço do vetor evento (objeto da classe abstrada) em classes Aniversario ou Reunião

2 Respostas

MarkKnopfler

Amigo, ao invés de perguntar dentro da classe Agenda, pergunte fora e faça sua agenda receber o evento já instanciado:

public boolean add(Evento e){ … }

Procure programar pensando no Evento (abstrato e geral), e não nos tipos de eventos concretos. É dessa forma mesmo que vc deve fazer.

Aí quanto ao tipo concreto de evento que vai ser criado, deixe isso para quem chama a Agenda. Dali a pouco vai ter o evento Confraternização e vc, além de criar a classe e atualizar a interface gráfica, terá que mexer na agenda também. Você não quer isso.

Eu preferiria perguntar ao usuário o tipo do evento e instanciar a classe adequada (Reuniao ou Aniversario) na interface gráfica. Por exemplo, o formulário de cadastrar reunião vai mostrar os campos, fazer Reuniao r = new Reuniao(); e jogar essa reunião para a agenda:

agenda.add®;

A classe agenda ficará menos acoplada, pois dependerá somente de Evento, e não de 200 tipos específicos.

Também retire o “extends Evento” da Agenda. Quem vai ter essa declaração serão Reuniao e Aniversario.

F_ix1

Opa brother, obrigado pela resposta em alguns pontos me ajudaram bastantes!

infelizmente ainda estou com um problema com o vetor de objeto eventos[] de uma classe abstrada.

import javax.swing.JOptionPane;
import sun.reflect.generics.visitor.Reifier;
public class Agenda  {
    //varaiveis
    private int maxEventos;
    private int controle=0;
    public int getMaxEventos() {return maxEventos;}
    public void setMaxEventos(int maxEventos) {this.maxEventos = maxEventos;}
    
    
    //construtores
    public Agenda(){}
    public Agenda(int maxEventos){
        this.maxEventos = maxEventos;
        System.out.print("Construtor sucess!!\n");
        System.out.print(" vetor Evento criado com sucesso!!\n");
        Evento eventos[] = new Evento[maxEventos]; //CRIANDO O VETOR DE OBJETOS DA CLASSE Evento
       
    };
    
    //vetor objeto ainda não declarado
            


    //metodos


    public boolean add(){        
        if(controle == maxEventos || controle >= maxEventos){
            
            JOptionPane.showMessageDialog(null, "Infelizmente não se pode marcar mais evento \n Agenda full");
            return false;
        }
        else {
            int qualevento;
            qualevento = Integer.parseInt(JOptionPane.showInputDialog(null, "QUAL É O EVENTO?\n  Digite 1 para marcar Reuião \n Digite 2 ou qualquer numero para marcar Aniversario"));
            if(qualevento == 1){
                  String lugar;
                  int inicio,fim;
                  lugar = JOptionPane.showInputDialog("Qual é o lugar onde vai acontecer a reunião?");
                  inicio = Integer.parseInt(JOptionPane.showInputDialog("Qual é o horario de inicio da reunião"));
                  fim = Integer.parseInt(JOptionPane.showInputDialog("Qual é a hora prevista para o fim?"));
                  System.out.print("variaveis setadas com sucesso lugar,inicio e fim\n");
                  System.out.print("Construtor declarado com sucesso de numero"+controle+"\n");
                  eventos[this.controle] = new Reuniao(lugar,inicio,fim); // MINHA CLASSE ADD NÃO CONSEGUE ENXERGAR A DECLARAÇÃO DO VETOR ''/ 
                  eventos[this.controle].mostra();
                  
            }
            else {
                String nome;
                nome = JOptionPane.showInputDialog("Qual o nome do aniversariante?");
                eventos[controle] = new Aniversario(nome);
            }
            controle = controle + 1;
            return true;
        }
    }
    public boolean completa(){
        if(1==1){return false;}
        else {return true;}
        
    }
   
}

na hora da declaração

eventos[controle] = new Reuniao(lugar,inicio,fim);
ou
eventos[controle] = new Aniversario(nome);

não vai rsrs, da erro e não consigo montar o objeto tudo porque eu não sei por qual motivo toda a classe não enxerga minha declaração la no construtor e eu preciso manter ela visivel pois muitas outras classes iram utilizar desse evento

Criado 10 de novembro de 2012
Ultima resposta 14 de nov. de 2012
Respostas 2
Participantes 2