Laís G ® 0 Denunciar post Postado Novembro 11, 2010 Olá pessoal, será que alguém por obséquio pode me ajudar com essas duas questões? 1)Implemente: a) Uma classe Transporte com atributo ligado (tipo boolean) e velocidade (tipo int) e métodos liga() e desliga(). O método liga torna o atributo ligado true e o método desliga torna o atributo ligado false, além de tornar a velocidade zero. Crie também métodos get/set para modificar o atributo velocidade, sendo que a velocidade não pode ser negativa. b)Uma subclasse de Transporte chamada Carro. Carro deve ter o atributo quilometragem (tipo int) e os métodos necessários para lê-lo e alterá-lo (get/set). A quilometragem não pode ser negativa, nem ultrapassar o valor 999999. A velocidade do Carro não pode ser negativa, nem ultrapassar 200. Começei fazendo isto: na classe Transporte public class Transporte { private boolean ligado; private int velocidade; void liga(){ ligado = true; } void desliga(){ ligado = false; velocidade = 0; } public int getVelocidade(){ return velocidade; } public void SetVelocidade (int velocidade){ this.velocidade = velocidade; } } Já na subclasse Carro public class Carro extends Transporte { private int quilometragem; public int getQuilometragem (){ return quilometragem; } public void setQuilometragem (int quilometragem){ this.quilometragem = quilometragem; } } * Não estou conseguindo atender a condição na classe Transporte q pede para modificar o atributo velocidade, sendo que velocidade não pode ser negativa. * Também não estou conseguindo atender as condições na subclasse Carro, onde Carro deve ter os métodos necessários para lê-lo e alterá-lo (get/set). Além da quilometragem e velocidade ñ poder ser negativa nem ultrapassar o valor 999999 e 200, respectivamente. E aqui a 2ª questão... 2)Em relação as classes criadas na questão anterior, considere o trecho de código: public class UsaTransporte{ public static void main (String[]args){ Transporte carro = new Carro(); carro.setQuilometragem(5000); } } Este trecho de código possui erros?Qual(is)? Se tiver faça a(s) devida(s) correção(ões). * Bom para conseguir resolver a 2ª questão, primeiro preciso conseguir fazer a 1ª. Então por isso volto a pedir, por obséquio ajudem-me a solucionar este problema. Compartilhar este post Link para o post Compartilhar em outros sites
Vergil 15 Denunciar post Postado Novembro 11, 2010 Só porque você pediu por obséquio e não por favor. :) Na classe Transporte você deverá adicionar uma condição para definir o valor do atributo através do método setVelocidade. E presta atenção numa coisa. A convenção é utilizar get para ler e set para escrever. Ou seja, em minúsculo. Ex.: setVelocidade(int velocidade) e não SetVelocidade(int velocidade) public void setVelocidade (int velocidade) { if (velocidade > 0) { this.velocidade = velocidade; } } Na classe Carro você tem que adicionar uma condição no método setQuilometragem. public void setQuilometragem (int quilometragem) { if (quilometragem > 0 && quilometragem <= 999999) { this.quilometragem = quilometragem; } } E também deverá sobrescrever o método setVelocidade da classe pai, fazendo com que ele verifique também o limite de velocidade. public void setVelocidade (int velocidade) { if (velocidade > 0 && velocidade <= 200) { this.velocidade = velocidade; } } A segunda é tão fácil que não precisa nem responder. Basta mandar compilar. Compartilhar este post Link para o post Compartilhar em outros sites
Laís G ® 0 Denunciar post Postado Novembro 12, 2010 Só porque você pediu por obséquio e não por favor. :) Na classe Transporte você deverá adicionar uma condição para definir o valor do atributo através do método setVelocidade. E presta atenção numa coisa. A convenção é utilizar get para ler e set para escrever. Ou seja, em minúsculo. Ex.: setVelocidade(int velocidade) e não SetVelocidade(int velocidade) public void setVelocidade (int velocidade) { if (velocidade > 0) { this.velocidade = velocidade; }}Na classe Carro você tem que adicionar uma condição no método setQuilometragem.public void setQuilometragem (int quilometragem) { if (quilometragem > 0 && quilometragem <= 999999) { this.quilometragem = quilometragem; }}E também deverá sobrescrever o método setVelocidade da classe pai, fazendo com que ele verifique também o limite de velocidade.public void setVelocidade (int velocidade) { if (velocidade > 0 && velocidade <= 200) { this.velocidade = velocidade; }}A segunda é tão fácil que não precisa nem responder. Basta mandar compilar. Valeu Vergil, muito obrigada mesmo!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif A questão compilou beleza!! :lol: Só porque você pediu por obséquio e não por favor. :) você não é muito fã de por favor? :huh: Compartilhar este post Link para o post Compartilhar em outros sites
Vergil 15 Denunciar post Postado Novembro 12, 2010 você não é muito fã de por favor? :huh:O nome disso é sarcasmo! :lol: Espero que você tenha entendido a parte de sobrescrita do método. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 12, 2010 você não é muito fã de por favor? Acredito que o ponto, não é ser ou não, fã de "por favor". É que "por obséquio" é mais elegante, tão elegante quanto à própria linguagem Java. Falando em elegância, existe um design pattern GoF para esse problema, chama-se State: Quando o comportamento de um objeto é dependente e pode variar, em tempo de execução, conforme seu estado, o design pattern State permite que você encapsule esse comportamento, delegando solicitações específicas ao objeto de estado. Imagine que, se você desligar um carro, em movimento, você corre o risco de causar um acidente, mas um navio pode ser desligado que ele não afundará. Da mesma forma, é impossível, mesmo para o navio, desligá-lo se ele já estiver desligado. com.transporte.Transporte package com.transporte; public interface Transporte { public void liga(); public void desliga(); public void velocidade( int velocidade ); } com.transporte.TransporteAbstrato package com.transporte; import com.transporte.estado.Estado; import com.transporte.estado.FabricaEstado; public abstract class TransporteAbstrato implements Transporte { private Estado estado; public TransporteAbstrato(){ estado = fabricaEstado().criaEstadoDesligado(); } public void liga() { estado.liga( this ); } public void desliga() { estado.desliga( this ); } public void velocidade(int velocidade) { estado.velocidade( this , velocidade ); } public void mudaEstado( Estado novo ){ estado = novo; } abstract protected FabricaEstado fabricaEstado(); } com.transporte.estado.Estado package com.transporte.estado; public interface Estado { public void liga( Transporte transporte ) throws IllegalStateException; public void desliga( Transporte transporte ) throws IllegalStateException; public void velocidade( Transporte transporte , int velocidade ) throws IllegalStateException; } com.transporte.estado.EstadoAbstrato package com.transporte.estado; public abstract class EstadoAbstrato implements Estado { public void liga( Transporte transporte ) throws IllegalStateException { throw new IllegalStateException( "Você não pode ligar esse meio de transporte" ); } public void desliga( Transporte transporte ) throws IllegalStateException { throw new IllegalStateException( "Você não pode desligar esse meio de transporte" ); } public void velocidade( Transporte transporte , int velocidade ) throws IllegalStateException { throw new IllegalStateException( "Você não pode mudar a velocidade desse meio de transporte" ); } } com.transporte.estado.FabricaEstado package com.transporte.estado; public interface FabricaEstado { public Estado criaEstadoDesligado(); } com.transporte.carro.Carro package com.transporte.carro; import com.transporte.TransporteAbstrato; import com.transporte.carro.estado.FabricaEstadoCarro; import com.transporte.estado.FabricaEstado; public class Carro extends TransporteAbstrato { @Override protected FabricaEstado fabricaEstado() { return new FabricaEstadoCarro(); } } com.transporte.carro.estado.CarroDesligado package com.transporte.carro.estado; import com.transporte.Transporte; import com.transporte.carro.Carro; import com.transporte.estado.EstadoAbstrato; public class CarroDesligado extends EstadoAbstrato { @Override public void liga( Transporte transporte ) throws ClassCastException { if ( transporte instanceof Carro ){ System.out.println( "Ligando o carro" ); ((Carro) transporte).mudaEstado( new CarroLigadoParado() ); } else { throw new ClassCastException( "O estado de um carro espera que o transporte seja um carro" ); } } } com.transporte.carro.estado.CarroLigadoParado package com.transporte.carro.estado; import com.transporte.Transporte; import com.transporte.carro.Carro; import com.transporte.estado.EstadoAbstrato; public class CarroLigadoParado extends EstadoAbstrato { final protected static int VELOCIDADE_MAXIMA = 200; protected int velocidadeAtual = 0; @Override public void desliga( Transporte transporte ) throws ClassCastException { if ( transporte instanceof Carro ){ System.out.println( "Desligando o carro." ); ((Carro) transporte).mudaEstado( new CarroDesligado() ); } else { throw new ClassCastException( "O estado de um carro espera que o transporte seja um carro" ); } } @Override public void velocidade( Transporte transporte , int velocidade ) throws ClassCastException { if ( transporte instanceof Carro ){ if ( velocidade != 0 ){ CarroLigadoAndando estado = new CarroLigadoAndando(); ((Carro) transporte).mudaEstado( estado ); estado.velocidade( transporte, velocidade ); } } else { throw new ClassCastException( "O estado de um carro espera que o transporte seja um carro" ); } } } com.transporte.carro.estado.CarroLigadoAndando package com.transporte.carro.estado; import com.transporte.Transporte; import com.transporte.carro.Carro; public class CarroLigadoAndando extends CarroLigadoParado { @Override public void desliga( Transporte transporte ) throws IllegalStateException { throw new IllegalStateException( "Se você desligar o carro em movimento, vamos bater." ); } @Override public void velocidade( Transporte transporte , int velocidade ) throws ClassCastException, IllegalArgumentException { if ( transporte instanceof Carro ){ if ( velocidade >= 0 && velocidade <= VELOCIDADE_MAXIMA ){ System.out.printf( "Mudando a velocidade do carro de %d para %d\n" , velocidadeAtual , velocidade ); if ( velocidade == 0 ){ ((Carro) transporte).mudaEstado( new CarroLigadoParado() ); } else { velocidadeAtual = velocidade; } } else { throw new IllegalArgumentException( "A velocidade é inválida para o carro." ); } } else { throw new ClassCastException( "O estado de um carro espera que o transporte seja um carro" ); } } } com.transporte.carro.estado.FabricaEstadoCarro package com.transporte.carro.estado; import com.transporte.estado.Estado; import com.transporte.estado.FabricaEstado; public class FabricaEstadoCarro implements FabricaEstado { public Estado criaEstadoDesligado() { return new CarroDesligado(); } } com.Exemplo package com; import com.transporte.Transporte; import com.transporte.carro.Carro; public class Exemplo { public static void main( String[] args ) { Transporte transporte = new Carro(); testar( transporte ); } private static void testar( Transporte transporte ){ transporte.liga(); transporte.velocidade( 100 ); transporte.velocidade( 0 ); transporte.desliga(); } } A saída será: Ligando o carro Mudando a velocidade do carro de 0 para 100 Mudando a velocidade do carro de 100 para 0 Desligando o carro. E se tentarmos desligar o carro em movimento: package com; import com.transporte.Transporte; import com.transporte.carro.Carro; public class Exemplo { public static void main( String[] args ) { Transporte transporte = new Carro(); testar( transporte ); } private static void testar( Transporte transporte ){ transporte.liga(); transporte.velocidade( 100 ); //transporte.velocidade( 0 ); transporte.desliga(); } } Saída: Ligando o carro Mudando a velocidade do carro de 0 para 100 Exception in thread "main" java.lang.IllegalStateException: Se você desligar o carro em movimento, vamos bater. at com.transporte.carro.estado.CarroLigadoAndando.desliga(CarroLigadoAndando.java:9) at com.transporte.TransporteAbstrato.desliga(TransporteAbstrato.java:18) at com.Exemplo.testar(Exemplo.java:17) at com.Exemplo.main(Exemplo.java:10) O detalhe é que, em alguns casos, você pode ter apenas alguns estados, por exemplo: com.transporte.navio.Navio package com.transporte.navio; import com.transporte.TransporteAbstrato; import com.transporte.estado.FabricaEstado; import com.transporte.navio.estado.FabricaEstadoNavio; public class Navio extends TransporteAbstrato { @Override protected FabricaEstado fabricaEstado() { return new FabricaEstadoNavio(); } } com.transporte.navio.estado.FabricaEstadoNavio package com.transporte.navio.estado; import com.transporte.estado.Estado; import com.transporte.estado.FabricaEstado; public class FabricaEstadoNavio implements FabricaEstado { public Estado criaEstadoDesligado() { return new NavioDesligado(); } } com.transporte.navio.estado.NavioDesligado package com.transporte.navio.estado; import com.transporte.Transporte; import com.transporte.estado.EstadoAbstrato; import com.transporte.navio.Navio; public class NavioDesligado extends EstadoAbstrato { @Override public void liga( Transporte transporte ) throws ClassCastException { if ( transporte instanceof Navio ){ System.out.println( "Ligando o navio" ); ((Navio) transporte).mudaEstado( new NavioLigado() ); } else { throw new ClassCastException( "O estado de um navio espera que o transporte seja um navio" ); } } } com.transporte.navio.estado.NavioLigado package com.transporte.navio.estado; import com.transporte.Transporte; import com.transporte.estado.EstadoAbstrato; import com.transporte.navio.Navio; public class NavioLigado extends EstadoAbstrato { final private static int VELOCIDADE_MAXIMA = 300; private int velocidadeAtual = 0; @Override public void desliga( Transporte transporte ) throws ClassCastException { if ( transporte instanceof Navio ){ System.out.println( "Desligando o navio" ); ((Navio) transporte).mudaEstado( new NavioDesligado() ); } else { throw new ClassCastException( "O estado de um navio espera que o transporte seja um navio" ); } } public void velocidade( Transporte transporte , int velocidade ) throws ClassCastException, IllegalArgumentException { if ( transporte instanceof Navio ){ if ( velocidade >= 0 && velocidade <= VELOCIDADE_MAXIMA ){ System.out.printf( "Mudando a velocidade do navio de %d para %d\n" , velocidadeAtual , velocidade ); velocidadeAtual = velocidade; } else { throw new IllegalArgumentException( "Velocidade inválida para o navio" ); } } else { throw new ClassCastException( "O estado de um navio espera que o transporte seja um navio" ); } } } E agora, precisamos apenas mudar a instância do objeto no exemplo anterior: com.Exemplo package com; import com.transporte.Transporte; import com.transporte.navio.Navio; public class Exemplo { public static void main( String[] args ) { Transporte transporte = new Navio(); testar( transporte ); } private static void testar( Transporte transporte ){ transporte.liga(); transporte.velocidade( 100 ); //transporte.velocidade( 0 ); transporte.desliga(); } } A saída: Ligando o navio Mudando a velocidade do navio de 0 para 100 Desligando o navio ;) Compartilhar este post Link para o post Compartilhar em outros sites
Vergil 15 Denunciar post Postado Novembro 12, 2010 você não é muito fã de por favor? Acredito que o ponto, não é ser ou não, fã de "por favor". É que "por obséquio" é mais elegante, tão elegante quanto à própria linguagem Java. Falando em elegância, existe um design pattern GoF para esse problema, chama-se State: He! He! Exatamente! Pra não assustar a nossa colega que certamente está começando. Devemos deixar claro que isso é um padrão de projeto e que deve ser usado apenas quando necessário. Padrões de projeto existem pra resolver problemas de complexida no desenho do projeto. E devem ser utilizados com moderação. Caso contrário você colocará complexidade onde é simples. Resumindo: tentará matar uma formiga com um canhão. Compartilhar este post Link para o post Compartilhar em outros sites
Laís G ® 0 Denunciar post Postado Novembro 12, 2010 O nome disso é sarcasmo! :lol: Espero que você tenha entendido a parte de sobrescrita do método. Vergil, consegui entender a parte de sobrescrita de métodos, mais uma vez muita obrigada! :D Acredito que o ponto, não é ser ou não, fã de "por favor". É que "por obséquio" é mais elegante, tão elegante quanto à própria linguagem Java :huh: :o Quanto código hein...rsrs :mellow: ^_^ João Batista realmente "por obséquio" é bem mais elegante do que "por favor"! B) De qualquer maneira agradeço novamente ao Vergil e a você por mandar estas "implementações" ou padrão de projeto como falou o Vergil, embora vá levar ainda um tempo para eu realmenter entender e, conseguir fazer e utilizá-lo de maneira correta e quando necessário! ;) Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 12, 2010 de maneira correta e quando necessário! Perceba, Laís, que "correto" é muito relativo. A melhor solução para um problema, é aquela que o resolve de maneira simples e eficiente. Quanto ao State design pattern, foi apenas uma ilustração, não uma sugestão de solução que, como o Virgil disse, seria "matar uma formiga com um canhão". Encapsulamento, delegação e reutilização são conceitos intrinsecamente ligados à orientação a objetos e, consequentemente, à linguagem Java. O uso de padrões de projeto tem, como objetivo fundamental, reutilizar várias e várias vezes uma mesma solução para um problema corriqueiro. Desejo-lhe sucesso em seus estudos, e que minha ilustração não tenha lhe confundido. ;) Compartilhar este post Link para o post Compartilhar em outros sites