[Resolvido]Exercicio de Java Classe Abstrata, Herença e Métodos Getters e Setters

Galera eu consegui resolver o exercício, porém, foi o 1° que fiz sobre esses assuntos do titulo, queria dicas, e o que vocês acharam se realmente esta correto, ou tem gambiarra kkk ou um método melhor, ou se esta correndo mesmo. vlw

O Exercicio é o seguinte:

2 ? Crie uma classe calculadora. Esta classe deve ser abstrata e implementar as operações básicas (soma, subtração, divisão e multiplicação). Utilizando o conceito de herança crie uma calculadora cientifica que implementa os seguintes cálculos: raiz quadrada e a potência. Dica utilize a classe Math do pacote java.lang.

[code] package Exercicio2;

public abstract class Calculadora {

protected double soma;
protected double sub;
protected double multi;
protected double div;


public Calculadora(){
	 
}


public double getSoma() {
	return this.soma;
}

public void setSoma(double soma) {
	this.soma = soma;
}

public double getSub() {
	return this.sub;
}

public void setSub(double sub) {
	this.sub = sub;
}

public double getMulti() {
	return this.multi;
}

public void setMulti(double multi) {
	this.multi = multi;
}

public double getDiv() {
	return this.div;
}

public void setDiv(double div) {
	this.div = div;
}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\

package Exercicio2;

public class CalculadoraConcreta extends Calculadora{

public CalculadoraConcreta() {
	
}
	
public double getSoma(){
	return this.soma;
}

public double getSub(){
	return sub;
}

public double getMulti(){
	return multi;
}

public double getDiv(){
	return div;
}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
package Exercicio2;

public class CalculadoraTeste {

public static void main(String[] args) {
	
	CalculadoraConcreta Calc = new CalculadoraConcreta();

		Calc.setSoma(5 + 5);
		System.out.println("O Valor da Soma é " + Calc.getSoma());
		
		Calc.setSub(10 - 6);
		System.out.println("O Valor da Subtração é " + Calc.getSub());
		
		Calc.setMulti(6 * 5);
		System.out.println("O Valor da Multiplicação é " + Calc.getMulti());
		
		Calc.setDiv(6 / 5);
		System.out.println("O Valor da Divisão é " + Calc.getDiv());
		
		System.out.println("A raiz Quadrada é " + Math.sqrt(16));
		
		System.out.println("A potencia é " + Math.pow(2,10));
}

}

[/code]

Olá Gabs-JV :smiley:

Olhando brevemente o código, algumas coisas não fazem sentido:

*Pra que serve estes seus gets e sets, eles não fazem o calculo, note:

Calc.setMulti(6 * 5);  
System.out.println("O Valor da Multiplicação é " + Calc.getMulti());

Sendo que desta maneira seria mais fácil e rápido:

System.out.println("O Valor da Multiplicação é " + (6 * 5));

*Sua divisão aceita 0.

*Suas variáveis são protegidas, sendo que poderia ser privadas ou nem precisaria ter (seus métodos poderia receber como parâmetro os valores e retornar o cálculo)

Leia este artigo :arrow: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/ você entenderá como fazer seus gets e sets corretamente. :smiley:

[quote=Gabs-JV]Galera eu consegui resolver o exercício, porém, foi o 1° que fiz sobre esses assuntos do titulo, queria dicas, e o que vocês acharam se realmente esta correto, ou tem gambiarra kkk ou um método melhor, ou se esta correndo mesmo. vlw

O Exercicio é o seguinte:

2 ? Crie uma classe calculadora. Esta classe deve ser abstrata e implementar as operações básicas (soma, subtração, divisão e multiplicação). Utilizando o conceito de herança crie uma calculadora cientifica que implementa os seguintes cálculos: raiz quadrada e a potência. Dica utilize a classe Math do pacote java.lang.

[code] package Exercicio2;

public abstract class Calculadora {

protected double soma;
protected double sub;
protected double multi;
protected double div;


public Calculadora(){
	 
}


public double getSoma() {
	return this.soma;
}

public void setSoma(double soma) {
	this.soma = soma;
}

public double getSub() {
	return this.sub;
}

public void setSub(double sub) {
	this.sub = sub;
}

public double getMulti() {
	return this.multi;
}

public void setMulti(double multi) {
	this.multi = multi;
}

public double getDiv() {
	return this.div;
}

public void setDiv(double div) {
	this.div = div;
}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\

package Exercicio2;

public class CalculadoraConcreta extends Calculadora{

public CalculadoraConcreta() {
	
}
	
public double getSoma(){
	return this.soma;
}

public double getSub(){
	return sub;
}

public double getMulti(){
	return multi;
}

public double getDiv(){
	return div;
}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
package Exercicio2;

public class CalculadoraTeste {

public static void main(String[] args) {
	
	CalculadoraConcreta Calc = new CalculadoraConcreta();

		Calc.setSoma(5 + 5);
		System.out.println("O Valor da Soma é " + Calc.getSoma());
		
		Calc.setSub(10 - 6);
		System.out.println("O Valor da Subtração é " + Calc.getSub());
		
		Calc.setMulti(6 * 5);
		System.out.println("O Valor da Multiplicação é " + Calc.getMulti());
		
		Calc.setDiv(6 / 5);
		System.out.println("O Valor da Divisão é " + Calc.getDiv());
		
		System.out.println("A raiz Quadrada é " + Math.sqrt(16));
		
		System.out.println("A potencia é " + Math.pow(2,10));
}

}

[/code][/quote]

[quote=InicianteJavaHenrique]Olá Gabs-JV :smiley:

Olhando brevemente o código, algumas coisas não fazem sentido:

*Pra que serve estes seus gets e sets, eles não fazem o calculo, note:

Calc.setMulti(6 * 5);  
System.out.println("O Valor da Multiplicação é " + Calc.getMulti());

Sendo que desta maneira seria mais fácil e rápido:

System.out.println("O Valor da Multiplicação é " + (6 * 5));

*Sua divisão aceita 0.

*Suas variáveis são protegidas, sendo que poderia ser privadas ou nem precisaria ter (seus métodos poderia receber como parâmetro os valores e retornar o cálculo)

Leia este artigo :arrow: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/ você entenderá como fazer seus gets e sets corretamente. :smiley:
[/quote]

Obrigado InicianteJavaHenrique, por me ajudar, então eu concordo com você que eu poderia fazer o calculo direto, mas queria
colocar os conceitos do exercicio… então fiz tudo de uma vez e o calculo funciona sim.

e tipo eu coloquei protected pelo fato de private funcionar apenas na classe que ele esta sendo executado.

Eu troquei o protected pelo private e o eclipse reclamou falando que não conseguir visualizar a variavel e com o protected
Eu consigo utilizar nas Classe e SubClasses.

Mas isso é meio relevante, eu queria mesmo era treinar os conceitos de OO vlw.

você tem que pensar nas operações como métodos não atributos


public class Calculadora{

    public int soma(int numero1, int numero2){
        //implementacao
    }

    public int subtracao(int numero1, int numero2){
        //implementacao
    }

    //etc..
}

A tua calculadora não calcula! :shock:

Provavelmente, o que é pretendido é que seja a tua calculadora a realizar as operações e não ter simplesmente uma propriedade com o nome de cada operação…

Por exemplo:


int soma(int a, int b){
return a+b;
}

[quote=Gabs-JV][quote=InicianteJavaHenrique]Olá Gabs-JV :smiley:

Olhando brevemente o código, algumas coisas não fazem sentido:

*Pra que serve estes seus gets e sets, eles não fazem o calculo, note:

Calc.setMulti(6 * 5);  
System.out.println("O Valor da Multiplicação é " + Calc.getMulti());

Sendo que desta maneira seria mais fácil e rápido:

System.out.println("O Valor da Multiplicação é " + (6 * 5));

*Sua divisão aceita 0.

*Suas variáveis são protegidas, sendo que poderia ser privadas ou nem precisaria ter (seus métodos poderia receber como parâmetro os valores e retornar o cálculo)

Leia este artigo :arrow: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/ você entenderá como fazer seus gets e sets corretamente. :smiley:
[/quote]

Obrigado InicianteJavaHenrique, por me ajudar, então eu concordo com você que eu poderia fazer o calculo direto, mas queria
colocar os conceitos do exercicio… então fiz tudo de uma vez e o calculo funciona sim.

e tipo eu coloquei protected pelo fato de private funcionar apenas na classe que ele esta sendo executado.

Eu troquei o protected pelo private e o eclipse reclamou falando que não conseguir visualizar a variavel e com o protected
Eu consigo utilizar nas Classe e SubClasses.

Mas isso é meio relevante, eu queria mesmo era treinar os conceitos de OO vlw.[/quote]

Bom, para o seu metodo de multiplicacao eu faria assim:

[code]public static double operacao(double valor1, double valor2, char operacao)
throws IllegalArgumentException {
switch (operacao) {
case ‘-’:
return valor1 - valor2;
case ‘*’:
return valor1 * valor2;
case ‘/’:
return valor1 / valor1;
case ‘+’:
return valor1 + valor2;
default:
throw new IllegalArgumentException();
}
}

public static void main(String[] args) {
	while (true) {
		double valor1 = new Scanner(System.in).nextDouble();
		double valor2 = new Scanner(System.in).nextDouble();
		String operacao = new Scanner(System.in).nextLine();
		try {
			System.out.println("O resultado de " + valor1 + " "
					+ operacao.charAt(0) + " " + valor2 + " é: "
					+ operacao(valor1, valor2, operacao.charAt(0)));
			break;
		} catch (IllegalArgumentException e) {
			System.out.println("Operação inválida!");
			continue;
		}
	}
}

[/code]

Assim você deixaria ele mais generico, no entanto eu sinto que eu fiz algo terrivel ae haha.

A proposito, nao entendi o uso de herença no seu codigo. Pode ser que eu estava com pressa e não prestei atenção mas pelo que eu vi não entendi o sentido.

Switch pode ser substituído por polimorfismo, e aí sim, ter algo genérico.

Agora, seu professor pediu exatamente o exemplo que escrevi para a Wiki:

Além de você não usar os conceitos de herança você pensou nas operaçãos como atributos e não como métodos

[code]public abstract class Calculadora {

//deveira ser métodos
protected double soma;
protected double sub;
protected double multi;
protected double div; [/code]

tinha que ficar assim

[code]public abstract class Calculadora {

protected double resultado;

public void soma(double numero1, double numero2){
	//implementação
}

public void subtrai(double numero1, double numero2){
	//implementação
}

public void divide(double numero1, double numero2){
	//implementação
}

public void multiplica(double numero1, double numero2){
	//implementação
}

}[/code]

pois quando extendesse para a nova classe

[code]public abstract class CalculadoraCientifica extends Calculadora

//deve se implementar apenas os novos métodos de raiz quadrada e potência, já que você estendeu Calculadora ele herda os métodos básicos
public void raiz(double numero1){
//implementação
}

public void potencia(double numero1, double numero2){
	//implementação
}

[/code]

Isso é o conceito básico de herança e implementação de códigos

[quote=Gabs-JV]
Obrigado InicianteJavaHenrique, por me ajudar, então eu concordo com você que eu poderia fazer o calculo direto, mas queria
colocar os conceitos do exercicio… então fiz tudo de uma vez e o calculo funciona sim.[/quote]

Sim, mas eu não tinha o livro em mãos :smiley:

[quote=Gabs-JV]e tipo eu coloquei protected pelo fato de private funcionar apenas na classe que ele esta sendo executado.
Eu troquei o protected pelo private e o eclipse reclamou falando que não conseguir visualizar a variavel e com o protected
Eu consigo utilizar nas Classe e SubClasses. [/quote]

Sim, o modificador protected só tem visibilidade em seu própria classe e em suas sub’s.

Tá certo se aprende aos poucos :smiley:

:thumbup:

Galera refiz tudo denovo… com a ajuda de vocês e ficou assim…


package Calculadora;

public abstract class Calculadora {

	protected int resultado;

	public int somar(int valor1, int valor2){
		return this.resultado = valor1 + valor2;
	}
	
	public int sub(int valor1, int valor2){
		return this.resultado = valor1 - valor2;
	}
	
	public int multi(int valor1, int valor2){
		return this.resultado = valor1 * valor2;
	}
		
	public int div(int valor1, int valor2){
		return this.resultado = valor1 / valor2;
	}
		
	
}

/////////////////////////////////////////////////////////////////////////////////////////////////


package Calculadora;

public class CalculadoraCientifica extends Calculadora  {

	
		public int somar(){
		super.somar(100, 85);
		return super.resultado;
	}
		
		public int sub(){
		super.sub(5, 84);
		return super.resultado;
	}
		
		public int multi(){
		super.multi(6, 8);
		return super.resultado;
	}
		
		public int div(){
		super.div(10, 2);
		return super.resultado;
	
	}
		
		
	public double raizQuadrada() {  
		Math.sqrt(6);
		return super.resultado;
	}  
	
	
	public double potencia(){
		Math.pow(65, 86);
		return super.resultado;
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////

package Calculadora;

public class CalculadoraTeste {

	public static void main(String[] args) {
		
		CalculadoraCientifica calc = new CalculadoraCientifica();
		
			System.out.println(calc.somar());
			
			System.out.println(calc.sub());
			
			System.out.println(calc.multi());
			
			System.out.println(calc.div());
			
			System.out.println(calc.raizQuadrada());
			
			System.out.println(calc.potencia());
	}

}

Bom esta bem simples, na verdade estou começando agora…

O que voces acham?

Só uma coisa, na Classe CalculadoraCientifica você não precisava reescrever os métodos de somar, subitrair, dividir e multiplicar, pois você já extende a classe CalculadoraCientifica da classe Calculadora e nessa classe os métodos já existem e não é necessário reescrever, esses métodos já são herdados dessa classe, isso É HERANÇA, a não ser que você fosse reescrever os método acrescentando alguma coisa a mais, que nesse caso você já atribiu valores a eles, quando os valores deveria ser inserido na classe principla main, onde lá sim seria passado os valores como parametro para executar o cálculo, pois quem programa a classe não sabe os valores que o usuário irá digitar.

E seria interessante fazer seus métodos receberem parâmetros… e não usar números fixos (hard coded)

Cara arrumei aqui, vlw ai… realmente não faria sentido herdar e escrever denovo hehe… imagina um programa gigante… ficaria dificil… antes de escrever o codigo denovo na classe CalculadoraCientifica, eu tinha só colocado o extends e já tinha conseguido herdar no main ai eu não entendi, e pensei ué class abstract herda? mas na verdade ele ja tinha herdado ai eu escrevi tudo denovo hehe.

fiz isso… e deu certo… obg pela ajuda, apaguei os métodos na classe calculadora cientifica e estou calculando por parametros no main =)

mas agora deu outro problema parece que a div esta ligado com a potenciação e raizQuadrada, quando eu divido o mesmo resultado pra div parece na raizQuadrada e potenciação

mas agora deu outro problema parece que a div esta ligado com a potenciação e raizQuadrada, quando eu divido o mesmo resultado pra div parece na raizQuadrada e potenciação

[/quote]

poste os 3 métodos e as chamadas aos mesmos… não precisa postar todas as classes denovo.

mas agora deu outro problema parece que a div esta ligado com a potenciação e raizQuadrada, quando eu divido o mesmo resultado pra div parece na raizQuadrada e potenciação

[/quote]

poste os 3 métodos e as chamadas aos mesmos… não precisa postar todas as classes denovo.[/quote]

bom o codigo ficou assim

[code]package Calculadora;

public abstract class Calculadora {

protected int resultado;

public int somar(int valor1, int valor2){
	return this.resultado = valor1 + valor2;
}

public int sub(int valor1, int valor2){
	return this.resultado = valor1 - valor2;
}

public int multi(int valor1, int valor2){
	return this.resultado = valor1 * valor2;
}
	
public int div(int valor1, int valor2){
	return this.resultado = valor1 / valor2;
}

}
[/code]

[code]package Calculadora;

public class CalculadoraCientifica extends Calculadora {

public double raizQuadrada() {  
	Math.sqrt(49);
	return super.resultado;
}  


public double potencia(){
	Math.pow(96, 47);
	return super.resultado;
}

}

[/code]

[code]package Calculadora;

public class CalculadoraTeste {

public static void main(String[] args) {
	
	CalculadoraCientifica calc = new CalculadoraCientifica();
	
		System.out.println(calc.somar(56, 69));
		
		System.out.println(calc.sub(69, 58));
		
		System.out.println(calc.multi(5, 5));
		
		System.out.println(calc.div(24, 9));
		
		System.out.println(calc.raizQuadrada());
		
		System.out.println(calc.potencia());
}

}
[/code]

o que acontece?

Você não está enviando parâmetros para os seus 2 últimos métodos…

eles estão assim

   public double raizQuadrada() {    
        Math.sqrt(49); // realiza a operação mas não guarda o valor
        return super.resultado;  
    }    
      
      
    public double potencia(){  
        Math.pow(96, 47); // realiza a operação mas não guarda o valor
        return super.resultado;  
    }  

e quando você da o

return super.resultado;

você está retornando o último valor setado nessa variável… e quem setou ela? o método de dividir

 public int div(int valor1, int valor2){  
        return this.resultado = valor1 / valor2;  //aqui a variável é setada
 }  

não vou te dar a resposta porque quero que você consiga fazer sozinho… mas seguem umas dicas

1 - Tente implementar a calculadora removendo o atributo resultado
2 - Faça seus métodos da calculadora científica receberem parâmetros assim como os da Calculadora normal

Exatamente quando se extende a classe todas as classes filhas possuem os métodos da classe mãe ou seja mesmo se não escrever os métodos básicos na classe filha CalculadoraCientifica quando você chamar ela no main irá funcionar, ou seja Heranaça.

Você está no caminho!!