Duvida: classe ou interface

[color=darkblue][b]
Pessoal,

Estava criando um programa em java quando me deparei com uma duvida cruel…
Queria criar uma classe ContadorRegressivo e outra Cronometro…
As classes tem alguns metodos iguais e outros diferentes…
Daí fiquei na duvida se criava uma classe abstrata para ser extendida pelas duas ou criava uma inteface tipo Relogio para elas…

Dei uma pesquisada legal na net, mas ainda não consegui me livrar dessa duvida!!!

Quem puder me ajudar agradeceria muito…

Vlw,

[/b][/color]

Em dúvida sobre uma classe abstrata e uma interface, crie uma interface e uma implementação padrão.

oK, thingol! Mas olha soh a situação do meu codigo!!!

[code]public abstract class AbstractRelogio extends Thread
{
private Tempo tempo;
private boolean relogioParado;

protected AbstractRelogio()
{
    tempo = new Tempo(0, 0);
    relogioParado = true;
}

protected AbstractRelogio(Tempo tempo) 
{
    this.tempo = tempo;
    relogioParado = true;
}

protected AbstractRelogio(int minInicial, int segInicial) 
{
    tempo = new Tempo(minInicial, segInicial);
    relogioParado = true;
}


public Tempo getTempo() {
    return tempo;
}

public int getMinutos() {
    return tempo.getMinuto();
}

public int getSegundos() {
    return tempo.getSegundo();
}

public void iniciarRelogio() {
    relogioParado = false;
}

public void pararRelogio() {
    relogioParado = true;
}

public boolean isRelogioParado() {
    return relogioParado;
}

[/code]

Tempo eh uma classe que eu criei também!!!

[code]public class ContagemRegressiva extends AbstractRelogio
{
public ContagemRegressiva(Tempo tempo)
{
super(tempo);
}

public ContagemRegressiva(int minInicial, int segInicial) 
{
    super(minInicial, segInicial);
}


public void iniciarContagem() {
    iniciarRelogio();
    start();
}

public void pararContagem() {
    pararRelogio();
}

public boolean isRelogioZerado() {
    return getTempo().isZeroHora();
}

@Override
public void run() {
    do {
        if(getSegundos() > 0)
            getTempo().subSegundo();
        else if(getSegundos() == 0 && getMinutos() > 0) {
            getTempo().setSegundo(Tempo.MAX_SEG);
            getTempo().subMinuto();
        }
        
        esperarUmSegundo();
        
    } while(!isRelogioZerado() && !isRelogioParado());
    
    pararContagem();
}

}[/code]

O que vcs acham que eu podia melhorar??

Qualquer ajuda eh bem vinda!!!

Faltou essa outra classe!!!

[code]ublic class Cronometro extends AbstractRelogio
{
public Cronometro()
{
super();
}

public Cronometro(Tempo tempo) 
{
    super(tempo);
}

public Cronometro(int minInicial, int segInicial) 
{
    super(minInicial, segInicial);
}


public void iniciarCronometro() {
    iniciarRelogio();
    start();
}

public void pararCronometro() {
    pararRelogio();
}

@Override
public void run() {
    do {
        if(getSegundos() < Tempo.MAX_SEG)
            getTempo().addSegundo();
        else if(getSegundos() == Tempo.MAX_SEG) {
            getTempo().setSegundo(0);
            getTempo().addMinuto();
        }
        
        esperarUmSegundo();
        
    } while(!isRelogioParado());
}

}[/code]

vlw,

a) Uma coisa que não se deve fazer é fazer uma classe estender Thread. O correto é fazê-la implementar Runnable. A vantagem disso é que você pode testar a classe sem que você precise usá-la como uma thread mesmo.
b) Ainda sou da opinião de usar interfaces. Crie uma interface, amigo, e uma implementação-padrão se por acaso um comportamento for muito repetido pelas classes que implementam a tal interface.

Discussão recente sobre isso

[color=darkblue][b]
Obrigado thingol,

Não sabia desta dica sobre o Thread. Não achava que extender Thread era uma má prática…

vlw,

[/b][/color]