• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Inner Classes

12 mensagens neste tópico

Pessoal estou a aprender as inner classes , eu tenho a outer class Copos mas lá dentro tenho a classe feijoes, eu quando faço new Copos() preciso de tb fazer new feijoes() ?

Se encontrarem alguma estupidez no source digam para eu melhorar.

/*
* @author Tiago Palhota ( Gurzi )
*
* Created on December 8, 2006, 4:37 PM
* ############################################
*
*   Objectivo: Jogo dos Feijoes nos Copos
*   
*   Instruções 
*   ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*   Para Jogar: O jogador começa
*   com um startMoney de 40 euros podendo
*   apostar em qual copo seguindo as dicas
*   do Computador(pistas).
*   Será indicado por exemplo se o copo tiver
*   3 feijoes será dito que tem menos de 4 
*   feijoes. Em caso de falha perde a aposta.
*   Se acertar, triplica o valor acertado
*
*
* ############################################
*
*---------------------------------------------
*  USE THIS FOR FREE . BUT FIRST LEARN
*---------------------------------------------
*/

package pt.tiago.exercicios;

// ---------------------------------
    import java.util.Random;
    import java.io.*;
// ---------------------------------




class Copo {

    private class Feijoes {
    
        Random select =  new Random();
        int numFeijoes = (int) 1 + (select.nextInt(5));
        
        private String obterPista(int feijoes) //consoante o random gerado devolve uma pista
        {
            switch(feijoes)
            {
                case 1 : return " < 3";
                case 2 : return " < 5";
                case 3 : return " > 2";
                case 4 : return " > 3";
                case 5 : return " > 3";
            }
            return "";
        }
    }
    
}

public class GamePlay {
    public static void main(String[] args) {
        
        
        Reader in = null;
        double startMoney = 40;
        double valorActual = 40;
        double aposta = 0;
        final int apostaMinima = 1;
        int copoApostado = 0;
        int feijoesApostados = 0;
        
        
        System.out.println("----- Bem vindo ao jogo dos Feijoes --- ");
        System.out.println("Acerte e triplique a sua aposta");
        System.out.println("A sua Aposta minima e de 1 euro");
        
        while(valorActual > 1)
        {
            try
            {
                in =  new BufferedReader(new InputStreamReader(System.in)); //le o valor por input(inputStreamReader)
                System.out.println("Quanto vai querer apostar ?");
                aposta = Integer.parseInt(in.readLine());
                
                if(aposta < apostaMinima) //validacao da aposta minima
                 System.out.println("Nao Fez uma aposta aceitavel. Tem de apostar 1 euro de aposta minima");
                 else
                 {
                    Copo n1 = new Copo();
                    Copo n2 = new Copo();
                    Copo n3 = new Copo();
                    
                    System.out.println("Copo 1 : -- Dica : O Copo tem : " + n1.obterPista());
                    System.out.println("Copo 2 : -- Dica : O Copo tem :" +  n2.obterPista());
                    System.out.println("Copo 3 : -- Dica : O Copo tem : " + n3.obterPista());
                    System.out.println("***************************************************");
                    System.out.println("±±±±± Em Que copo pretende Apostar ? 1 2 ou 3 ");
                    copoApostado = Integer.parseInt(in.readLine());
                    System.out.println("*****Quantos Feijoes julga estarem no interior do Copo ? ");
                    feijoesApostados = Integer.parseInt(in.readLine());
                    
                    
                    switch(copoApostado)
                    {
                        case 1 : if( feijoesApostados == n1.numFeijoes )
                                 {
                                    valorActual = aposta * 3;
                                 }
                                 else
                                 {
                                    valorActual -= aposta;
                                 }
                                 break;
                        case 2 : if( feijoesApostados == n2.numFeijoes )
                                 {
                                    valorActual = aposta * 3;
                                 }
                                 else
                                 {
                                    valorActual -= aposta;
                                 }
                                 break;
                        case 3 : if( feijoesApostados == n3.numFeijoes )
                                 {
                                    valorActual = aposta * 3;
                                 }
                                 else
                                 {
                                    valorActual -= aposta;
                                 }
                                 break;
                     }
                     
                    
                }
            }
            catch(IOException e)
            {
                System.out.println(e.getMessage());
            }
      }      
            System.out.println("O seu valor actual é de " + valorActual);
       
    }
} 
        
         
        
        
        

       

       

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom pelo que vi assim por alto parece estar bem, mas para dizer a verdade não vejo grande utilidade em usar essa inner class nesse caso bastaria uma class visto a unica coisa que a class Copo tem dentro é a outra class as inner class por norma não são muito utilizadas a nivel de programação mas normalmente são mais usadas quando queremos definir objectos de baixo grau de complexidade que vão ser usados dentro de uma class de maior grau, o que não é o caso, no teu exemplo apenas colocas uma class dentro doutra sendo a inner class de maior grau que a class principal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu pensamento gera-se assim, um relogio tem uma pilha , entao vou ter uma classe relogio com uma classe pilha lá dentro, outro exemplo, uma caneta tem uma carga la dentro, entao vou ter uma classe caneta com uma inner chamada carga..

estou a pensar mal ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente ao grau pensa assim tem uma class Triangulo com tem todos os metodos imaginarios para triangulos mas que utiliza objectos Ponto para trabalhar entao defines uma inner class Ponto em que apenas defines o que é 1 Ponto e uns quantos métodos para o manipular...

A class de maior grau seria a class Triangulo que é a principal e tem o principal do programa a class de menor grau seria a Ponto que simplesmente iria definir o que era um ponto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente ao teu metodo de pensar cada um tem o seu :D

Não posso dizer que esteja mal porque até tem logica mas tens de avaliar se é necessario a criação de uma inner class no teu exemplo a class principal nao tem lá nada para alem da inner class, ai podias apenas ter a class Copo ou entao ter uma class abstrata Copo e uma class extended Feijoes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece porreiro, os únicos defeitos que tenha a apontar são algumas frases com o português um bocado esquisito... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu pensamento gera-se assim, um relogio tem uma pilha , entao vou ter uma classe relogio com uma classe pilha lá dentro, outro exemplo, uma caneta tem uma carga la dentro, entao vou ter uma classe caneta com uma inner chamada carga..

estou a pensar mal ?

acho que está a pensar mal...

tens razão na parte de criar uma classe para representar a pilha e uma para representar o relógio.

mas só existem pilhas em relógios?

suponhamos que agora criavas uma classe para representar um comando de televisão, como o comando também tem pilhas, também tinhas que criar outra inner class dentro do comando.

o que devias fazer era definir uma classe (pública) pilha, e as classes relógio e comando teria um atributo do tipo pilha.

só fazia sentido ter a classe pilha como inner class se as pilhas só existissem nos relógios.

uma inner class raramente faz sentido.

uma situação em que podias usar uma inner class era:

queres definir uma classe que representa um grafo. para tal vais representar os seus nodos e os seus arcos. à partida não existe mais nenhum contexto em que utilize nodos e arcos com a mesma definição dos nodos e os arcos dos grafos, por isso aqui faria sentido ter uma inner class para os nodos e outra para os arcos.

outro exemplo é a classe LinkedList, que é também um conjunto de entradas, e essas entradas só fazem sentido numa LinkedList, por isso estão definidas como inner class.

EDIT: no caso da caneta se calhar já faz sentido ter a carga como inner class.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok muito obrigado :)

Então vou tentar de outra maneira.

Mas então faço duas classes , uma para o Copo, outra para o Feijoes, e tenho que usar heranças ??

o Copo fica publico ? e os Feijoes ?

Depois vou criar uma chamada GamePlay que  vai ser publica , tem lá o maain, posso ter 2 classes publicas no mesmo ficheiro ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ter tudo public se quizeres, o que te aconselho nesse caso é a usar uma class abstrata para copo e um feijoes que herda a copo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok muito obrigado :)

Então vou tentar de outra maneira.

Mas então faço duas classes , uma para o Copo, outra para o Feijoes, e tenho que usar heranças ??

o Copo fica publico ? e os Feijoes ?

Depois vou criar uma chamada GamePlay que  vai ser publica , tem lá o maain, posso ter 2 classes publicas no mesmo ficheiro ?

não percebi muito bem em que é que consite o problema... por isso é difícil diz dizer qual a melhor organização para as classes. mas parece-me que não precisas da classe feijões para nada (as caracteristicas de um feijão - cor, tamanho, etc. - interessante-te para algumas coisa?), acho que apenas precisavas da classe copo, e neste saber o número de feijões que ele contém (ou seja, teria um atributo que era o número de feijões).

de qualquer modo nunca deves ter mais do que uma classe no mesmo ficheiro (a não ser que tenhas inner classes). mesmo no código que tens no primeiro post devias ter a classe Copo num ficheiro e a classe GamePlay noutro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já percebi, então e se os feijoes tivessem cor , tarmanho e isso tudo ???

Era uma inner class ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora