Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Laís G ®

Classe, Subclasse - herança

Recommended Posts

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

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

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

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

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:

 

Imagem Postada

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

 

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.