Herança de métodos com Interface

9 respostas
Mavericks

Tô com uma dúvida em um conceito de herança, implementei uma interface com um método calculaMatricula, tenho uma classe que implementa essa interface e outras que herdam da anterior, apenas essas vão utilizar o método calculaMatricula, mas a primeira classe que me referi implementa a interface, tendo que implementar o método calculaMatricula, mas eu não vou utilizar ele nessa classe.

Crio o método ?vazio??
Existe alguma boa prática para situações como essa??

9 Respostas

LPJava

a classe que implementa uma interface nao tem obrigação de implementar um metodo quando essa é abstract…

poe o codigo! ai!

christo

Esta primeira classe é abstrata?

Se não for, não seria o caso desta primeira classe não implementar esta interface?

Abrs,

sergiotaborda

Mavericks:
Tô com uma dúvida em um conceito de herança, implementei uma interface com um método calculaMatricula, tenho uma classe que implementa essa interface e outras que herdam da anterior, apenas essas vão utilizar o método calculaMatricula, mas a primeira classe que me referi implementa a interface, tendo que implementar o método calculaMatricula, mas eu não vou utilizar ele nessa classe.

Crio o método ?vazio??
Existe alguma boa prática para situações como essa??

Sim. O que vc está fazendo é criar uma estrutura de métodos que as classes filhas terão que implementar.
Se a classe mão não sabe como implementar (ou seja, não existe um default) então deixe o método sem implementação.
Para isso vc o declara abstract. Ao declara o método abstract a sua classe mae terá que ser abstract tb.

Em opção vc pode deixar o método implementado lançando uma exceção UnsuppotedOperationException, mas isso , embora válido é meio estranho. Só se utiliza se a classe mae precisa ser instanciada ( ou seja, quando não pode ser abstrata). Contudo estas duas coisas são contraditorias ou ela sabe implementar e não é abstrata nem lança exceção ou ela não sabe e é abstract.

Mavericks

LPJava:
a classe que implementa uma interface nao tem obrigação de implementar um metodo quando essa é abstract…

poe o codigo! ai!

Não defini a classe como abstrata, vou fazer isso…
Mas as classes filhas que herdarem dela vão precisar ser abstratas tb?

Valeu pelas dicas.

PS: Não tenho o código desse sistema aqui no serviço, está em casa, quando implementei eu consegui rodar, deixando o método vazio, mas achei isso um pouco errado, na verdade é mais uma dúvida conceitual do que de “código”.

LPJava

depende! A classe que for implementar o metodo vc coloca ela como uma class concreta…
Mas lembrando que ema uma classe abstrata vc pode ou nao ter metodos implementados… o recomendavel é que nao tenha, mais se fizer o compilador nao vai reclamar por isso!

Mavericks

Voltando ao assunto, é um exemplo bem simples, mas está dando um erro que não consigo resolver:
The type Funcionario must implement the inherited abstract method Empregado.calculaMatricula()

Classe Empregado
public abstract class Empregado implements MembroDaComunidade {
	
	public String nome;
	public String email;
	public String matricula;
	
	public abstract String calculaMatricula();

}
Classe Funcionário
public class Funcionario extends Empregado{
	
	public Funcionario (String nom, String mail){
		super.nome = nom;
		super.email = mail;
		
	}
	
	public String calculaMatricula(String num){
		return super.matricula = num + "123";
	}
	
}
Classe Teste
public class Teste {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Funcionario fc = new Funcionario("Rodrigo", "[email removido]");
		fc.calculaMatricula("123456");

	}

}

Tenho uma interface MembroDaComunidade, Empregado implementa essa interface e Funcionario extends de Empregado, mas está dando esse erro que citei no começo da mensagem.

Alguém sabe onde estou errando?
Acho que tem algo a ver com extender um método abstrato e tentar implementar ele sem ser abstrado, mas...

P

Olá,

Métodos abstratos residem em: classes abstratas, OU interfaces (que no caso são classes 100% abstratas).

Uma classe abstrata não precisa implementar nenhum método de uma interface. E no caso, voce remarcou o método herdado da interface dentro da sua classe abstrata.

Portanto, tire a declaração do método CalculaMatricula() da sua classe abstrata, e assim, coloque as outras classes para implementa-la. E dá um olhada nesses seus super ai.

Lembrando: classes abstratas também NUNCA podem ser instanciadas.

[]'s!

Mavericks

Então o correto seria eu ñ implementar a classe Empregado?
Ou poderia implementar a classe Empregado como uma interface que implementa outra interface?

O

O erro do exemplo é que as assinaturas dos métodos estão diferentes. Em Empregado, coloque assim:

public abstract String calculaMatricula(String num);

E pelo visto MembroDaComunidade também está com a mesma assinatura de Empregado, logo deve ser alterado para:

public String calculaMatricula(String num);

Pronto, agora está sintaticamente correto, só falta dar sentido a esta sua estranha estrutura.

Criado 24 de julho de 2008
Ultima resposta 29 de jul. de 2008
Respostas 9
Participantes 6