Opinião Classe Abstrata

7 respostas
ricardocomp

Olá pessoal,
eu queria algumas opiniões
sobre o uso de classe abstrata
Eu tenho uma classe abstrata:

public abstract class Analise{
	
	protected double resultado;
	
	//Construtor
	protected Analise(){
		resultado = 0;
	}
	
	protected Analise(double resultado){
		this.resultado = resultado;
	}
	
	/** 
         * O método getResultado é publico porque
         * precisará ser acessado direto na instância,
         * ou seja, não há implementação deste método
         * nas classes filhas.
         */
	public double getResultado(){
		return resultado;
	}
	
}

e tenho outra classe Extrato Seco:

public class ExtratoSeco extends Analise {
    private double pesoAntes;
    private double pesoDepois;

    public ExtratoSeco(){
        super();
    }
...
    public void calculaExtratoSeco(){
        resultado = (this.pesoDepois - this.pesoAntes) * 40;
    }
...
}

Eu gostaria de saber se é correto fazer
isso o que eu fiz, usei direto
o atributo resultado da classe
abstrata Analise para receber
o valor do cálculo no método
calculaExtratoSeco?

[]'s.

7 Respostas

ViniGodoy
Sim, é correto. Mas pq não usar uma interface?
public interface Analise{
	/** 
         * O método getResultado é publico porque
         * precisará ser acessado direto na instância,
         * ou seja, não há implementação deste método
         * nas classes filhas.
         */
	double getResultado();
}
public class ExtratoSeco implements Analise {
    private double pesoAntes;
    private double pesoDepois;

    public ExtratoSeco(){
        super();
    }
...
    public double getResultado(){
        return (this.pesoDepois - this.pesoAntes) * 40;
    }
...
}

Isso evita também a necessidade de chamar o método "calcula", que provavelmente será chamado sempre.

rod
ViniGodoy:
Sim, é correto. Mas pq não usar uma interface?
public interface Analise{
	/** 
         * O método getResultado é publico porque
         * precisará ser acessado direto na instância,
         * ou seja, não há implementação deste método
         * nas classes filhas.
         */
	double getResultado();
}
public class ExtratoSeco implements Analise {
    private double pesoAntes;
    private double pesoDepois;

    public ExtratoSeco(){
        super();
    }
...
    public double getResultado(){
        return (this.pesoDepois - this.pesoAntes) * 40;
    }
...
}

Isso evita também a necessidade de chamar o método "calcula", que provavelmente será chamado sempre.

Concordo com a idéia do ViniGodoy, e somente para acrescentar essa forma também te previne para o problema do desenvolvedor esquecer de chamar o metodo "calculaXXX()" antes de chamar o getResultado()

ricardocomp

Olá ViniGodoy,
Obrigado pela ajuda,
o motivo de não usar
interface é porque
eu tenho várias análises
e cada uma é independente
da outra, e além disso
cada uma tem o seu cálculo
específico.

Obrigado msm. :smiley:

[]'s.

rmendes08

ricardocomp:
Olá ViniGodoy,
Obrigado pela ajuda,
o motivo de não usar
interface é porque
eu tenho várias análises
e cada uma é independente
da outra, e além disso
cada uma tem o seu cálculo
específico.

Obrigado msm. :smiley:

[]'s.

Mais um motivo para você usar interfaces. Interfaces são usadas para você definir um contrato que deve ser cumprido por quem a implementa. Classes abstratas são usadas quando, além de fornecer um contrato, você quer fornecer uma implementação. Como cada análise é independente, isso significa que você quer maior liberdade de implementação, que você pode obter com o uso de interface.

ricardocomp

Jóia rmendes08?
Obrigado pela ajuda
Mas se eu fosse usar uma interface
toda classe que implementasse
a interface seria obrigada a implementar
a assinatura dos métodos feita pelo contrato
da interface.

Por exemplo:

Além da classe do Extrato Seco
eu tenho outras como por exemplo
Álcool Superior:

public class AlcoolSuperior {

public double calculaCoefCorrelacaoAlcSup(Absorvancia[] absorvancia){
...
}

public double calculaKmAlcoolSuperior(Absorvancia[] absorvancia){
...
}

public boolean isFlagRegressao() {
...
}
...

}

Se usasse uma interface eu seria obrigado a implementar
um calculaKmXXX() na classe do Extrato Seco e Km
é um cálculo feito por 3 análises e mesmo assim
o Km delas usa parâmetros diferentes.

Obrigado pela ajuda rmendes08 e rlazoti. :smiley:

[]'s.

E

Digamos que você tenha uma determinada implementação de certos métodos que é mais ou menos sempre igual, exceto em alguns casos, e, como foi recomendado, você não queira usar herança para aproveitar a implementação.
Você pode criar uma classe que é a “implementação default” desses métodos, e usa delegação (não herança) para poder implementar esses métodos em outras classes que têm de implementar essa interface.
Vou dar um exemplo. Digamos que você tenha a seguinte interface:

interface Valuable {
    int getValue();
}

e você saiba que em 75% das vezes você só quer a seguinte implementação:

public int getValue() { return r.nextInt(); }

Em vez de fazer todo mundo herdar de uma classe que implementa Valuable, você faz o seguinte:

class Diamond implements Valuable {
    private Valuable v = new ValuableImpl();
    @Override
    public int getValue () { return v.getValue(); }
}

onde ValuableImpl é a seguinte classe:

class ValuableImpl implements Valuable {
    public int getValue() { return r.nextInt(); }
}

Eu sei que é tedioso fazer a delegação (porque você tem N implementações de métodos que só redirecionam para o método correspondente). Isso, infelizmente, é tedioso mesmo - a linguagem Scala (que roda na JVM) tem uma solução bem mais limpa para esse problema.

rmendes08

ricardocomp:
Jóia rmendes08?
Obrigado pela ajuda
Mas se eu fosse usar uma interface
toda classe que implementasse
a interface seria obrigada a implementar
a assinatura dos métodos feita pelo contrato
da interface.

Por exemplo:

Além da classe do Extrato Seco
eu tenho outras como por exemplo
Álcool Superior:

public class AlcoolSuperior {

public double calculaCoefCorrelacaoAlcSup(Absorvancia[] absorvancia){
...
}

public double calculaKmAlcoolSuperior(Absorvancia[] absorvancia){
...
}

public boolean isFlagRegressao() {
...
}
...

}

Se usasse uma interface eu seria obrigado a implementar
um calculaKmXXX() na classe do Extrato Seco e Km
é um cálculo feito por 3 análises e mesmo assim
o Km delas usa parâmetros diferentes.

Obrigado pela ajuda rmendes08 e rlazoti. :smiley:

[]'s.

Cara, não entendi sua justificativa para não usar interfaces. Qual a relação entre as classes Analise, ExtratoSeco e AlcoolSuperior ? Não entendi essa dependencia entre ExtratoSeco e AlcoolSuperior.

Criado 23 de outubro de 2009
Ultima resposta 23 de out. de 2009
Respostas 7
Participantes 5