Boa tarde, existe alguma forma de criar uma interface no java que possua métodos que podem OU NÃO ser sobrescritos pelas classes que implementam essa interface?
Minha duvida se da pelo seguinte fato:
tenho um sistema pronto feito baseado em template, aonde eu tenho a InterfaceTemplate que possui diversos métodos, e tenho já umas 40 classes de tela de CRUD que implementam dessa interface.
Gostaria de criar uma função nova no template porem nao sao todas telas que usam essa função. se eu criar o método na InterfaceTemplate, vou ter que obrigatóriamente implementar esse método.
Tem algum jeito de tornar esse metodo opcional?
Você pode fazer com que uma classe implemente 2 ou mais interfaces.
Pelo que você me disse, as classes já implementam a interface I1. Você pode criar uma segunda interface I2, por exemplo, e acrescentar esses outros métodos.
Aí você faz essas classes que deveriam implementar esses novos métodos implementar TAMBÉM a interface I2.
class X implements I1, I2 {
// métodos da interface I1...
// métodos da interface I2...
}
Outra forma é você criar uma subinterface, e adicionar nessa subinterface os métodos adicionais. Assim:
interface I2 extends I1 {
... novos métodos
}
...
class X implements I2 {
// métodos que já existem em I1
// novos métodos que só existem em I2
}
É, também dá para fazer assim (implementar e deixar vazio). É um pouco tosco porque você tem de mexer em código que já existe, mas é mais simples de entender.
Só tem uma forma de tu não ser obrigado a implementar um método de uma interface (além, obviamente, de não implementar a interface), não usando uma classe concreta. Como ?
Uma classe abstrata que implementa a interface
Uma interface que extenda esta interface
Agora, qualquer classe concreta que implemente uma interface terá, obrigatoriamente, de implementar seus respectivos métodos.
Então, aconselho a usar uma das soluções postadas pelo entanglement. A primeira solução dada por ele é se estes métodos forem algo totalmente “exclusivos”, sem nenhum relação com os teus CRUDS. Dessa forma, tu isola o serviço por completo.
Caso seja uma “extensão” do seu CRUD, mas direcionada a determinadas telas, a segunda solução, usando de herança, é mais adequada.
Hmm obrigado pessoal parece que nao tem jeito mesmo entao…
O que eu queria mesmo era evitar de ter que ficar alterando as classes que ja existem com métodos em branco…
Esse esquema ai de herdar a interface nem sabia que dava pra fazer, ficou legal mas acho que pra mim é melhor implementar os metodos e deixar em branco mesmo…
Valeu!