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??
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()
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
Popeye12345
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
ozix
O erro do exemplo é que as assinaturas dos métodos estão diferentes. Em Empregado, coloque assim:
publicabstractStringcalculaMatricula(Stringnum);
E pelo visto MembroDaComunidade também está com a mesma assinatura de Empregado, logo deve ser alterado para:
publicStringcalculaMatricula(Stringnum);
Pronto, agora está sintaticamente correto, só falta dar sentido a esta sua estranha estrutura.