O négocio é o seguinte eu tenho duas classes diferentes, uma de validação e outra de mensagem, só que eu queria que todas as outras classes extendece elas então eu fiz uma interface para cada uma delas (A,B), depois criei uma outra interface© que extende esses duas interface, validação e erro, criei uma classe(D) que implementa a interface que extend as outras duas interface. O problema é que quando eu crio uma classe e extendo da classe (D) os métodos que eu criei na implementação da interface A e B não são chamadas…
Provavelmente você tem um problema que seria melhor resolvido por composição e não com herança.
Mas, em todo caso, não vejo porque os métodos não seriam chamados. Pode postar algum exemplo de código?
Cara… poe o codigo das tuas criacoes ai pra gente poder visualizar essa teia…
abs
[quote=ViniGodoy]Provavelmente você tem um problema que seria melhor resolvido por composição e não com herança.
Mas, em todo caso, não vejo porque os métodos não seriam chamados. Pode postar algum exemplo de código?[/quote]
Uhum. Posta o código ae.
Extender é facil uai:
public interface queijo extends milk{}
public class MensagemBean implements MensagemBaseBean {
public MensagemBean() {
}
public FacesContext getContext() {
return FacesContext.getCurrentInstance();
}
public void addMessageError(String formulario, String id, String mensagem) {
this.getContext().addMessage(formulario + ":" + id, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, null));
}
}
public interface MensagemBaseBean {
public void addMessageError(String formulario, String id, String mensagem);
}
public interface BaseBeanGenerica extends MensagemBaseBean {
public void addMessageError(String formulario, String id, String mensagem);
}
public class BaseBean implements BaseBeanGenerica{
public void addMessageError(String formulario, String id, String mensagem) {
}
//Aqui não sei declarar o método
public class MyBean extends BaseBean{
private boolean isNaoVazio(){
boolean campoPreechido = true;
if (this.dataNascimento == null) {
campoPreechido = false;
super.addMessageError(this.getBinFormulario().getId(), "dataNasc", "Campo \"Data\" é obrigatório");
}
return campoPreechido;
}
}
A intenção é coloca um classe para validar junto com essa de msg.
Obs: Código reduzido.
Eita. Vc ta tentando fazer exemplo de EJB? Se for EJB3 estão faltando os anotations @Remote @Local e assim vai.
Cara… eu vou abstrair se estas tentando fazer EJB ou nao e me concentrar na sua sequencia de Implements e Extends…
Acho que queres isso…
class A extends F
class B extends F
interface C
interface D
interface E extends C,D
class F implements E
Nao tens isso no codigo que mandaste… E porque nao implementar nas classes A e B as Interfaces C e D diretamente…
class A implements C,D
class B implements C,D
Ou cria uma outra interface e tanto A quanto B implementariam dela… a menos que quisesse implementar logo de cara o codigo de Validacao e Mensgaem em um unico lugar, o que nao eh aconselhavel… isso causaria uma baixa coesao e um alto acoplamento…
Na minha humilde opinião ele está falando de JSF.
Resumidamente, o problema está que:
[code]
interface A {
void hello();
}
interface B {
String talk();
}
interface C extends A, B {
void metodo();
}
class D implements C {
void hello(){}
String talk(){};
void metodo(){};
}
class E extends D {
//seus métodos
//como não são métodos abstratos, você não é obrigado a implementa-los, já os mesmos encontra-se
//implementados na classe D
}[/code]
É algo assim que você tem e não funciona?
Ou seja, a classe E não tem acesso aos métodos das interface A e B?
Abraços.
nel, é isso mesmo vc é um gênio vc entendeu direitinho e melhor realmente é pra jsf. Eu tenho as beans, quero cria uma classe para mensagens e outra para validação de dados genéricos, exemplo cpf. Mas não posso extender as duas então fiz esse esquema mas não ta dando muito certo. E eu não quero fazer Classe de msg extender validação e a beans extender msg ou criar uma classe como todas as msg e validaçoes.
Quem me dera…é que na realidade eu trabalho com JSF, por isso deduzi que era de JSF que você estava falando.
Entendo…mas porque quer trabalhar com herança neste caso se você pode separar as duas funções em classes distintas e fazer com as mesmas implementem interfaces específicas?
Ou por acaso, você terá método em comum entre as classes que justifiquem o uso de herança?
Pois se forem classes com métodos distintos, o que me parece o caso, creio que o ideal seja como o adriano_si comentou e reforço acima, pois não vejo relação entre uma classe que trata de mensagens (seriam mensagem de avisos, erros, coisas assim certo?) e outra que trata de validação, como de CPF, CNPJ entre outro.
Ou você tem uma ideia totalmente diferente disso?
Mas em relação ao exemplo que eu dei acima, a classe E terá acesso a todos os métodos da classe D (com exceção dos private), tendo em vista que é uma classe filha.
Espero que eu tenha ajudado ao invés de atrapalhar.
Abraços!
Por exemplo, eu tenho um método que valida se o dado de entrada é número, tenho 5 beans que precisa desse método, por exemplo cpf, tem que ser número, a área de uma propriedade tem que ser número, o brinco de um animal tem que ser numero. Tem métodos que validão formatos de números tipo float com virgula também. Agora a classe de mensagens, todas as bens precisam delas, veja tenho 5 classes com métodos comuns e todas as outras com as mensagens. O que eu faço hj para funcionar é, replico em varias os métodos de validação e todas extend a classe de mensagem. Então eu tenho isNumber replicado em 5 classes diferente, putz é porco pra caramba. O que vc disse ta certo, tem acesso mesmo. Mas o que eu queria saber é pegando o seu exemplo supondo que eu implementa a classe A e B eu teria acesso aos métodos implementados na classe D ??? Pq é assim, se eu implementar A com uma mensagem “Ola”, parece que o implemente de D sobrepoe o de A, e eu não quero isso, na verdade eu nem sei de da para fazer isso.
Cara como o Viny falou la em cima, voce esta precisando eh de composicao e nao de heranca… Heranca voce pode usar nas suas classes de mensagem e validacao, mas nos seus Beans voce precisa de Objetos criados para essas classes e nao herda-las… Nao sei se entendi errado, mas me parece que voce quer que cada Bean herde uma unica classe ou Interface pra implementar ambos metodos (mensagem e validacao ??)…
Fico no aguardo…
Cara eu sei que dá para criar objetos da classe validação e mensagem na bean, ou mesmo fazer validação extend mensagem e todas as beans extend validação, mas o que eu quero fazer é
interface A {
String hello();
}
interface B {
String talk();
}
Class X implements B {
String talk(){
return "OLA"
}
}
Class Y implements A{
String hello(){
return "HELLO"
}
}
interface C extends A, B {
void metodo();
}
class D implements C {
void hello(){}
String talk(){};
void metodo(){};
}
class E extends D {
//seus métodos
//como não são métodos abstratos, você não é obrigado a implementa-los, já os mesmos encontra-se
//implementados na classe D
System.out.printiln("A Saida tem que ser :" + super.Y);
}
A Saida tem que ser : HELLO
Então Renato, E não é filho de Y, portanto, não tem como você utilizar o super.hello() e pegar a implementação de Y.
Isto só poderia ser feito, neste caso, sem entrar em muitos detalhes, se a Classe E fosse filha de Y e não da classe D, perfeito?
Experimenta adicionar o “System.out.println(“HELLO”);” na classe D na implementação do método hello() que vai funcionar como você quer.
Certo?
Ou para resolver sua situação, podes fazer assim:
Class D extends Y implements C {
void hello(){
super.hello();
}
//seus outros métodos.
}
Assim também funciona e você não precisaria alterar nada na sua classe E.
Edit: logicamente, na sua classe E você faria super.hello().
[quote=renato.dosantos]Cara eu sei que dá para criar objetos da classe validação e mensagem na bean, ou mesmo fazer validação extend mensagem e todas as beans extend validação, mas o que eu quero fazer é
interface A {
String hello();
}
interface B {
String talk();
}
Class X implements B {
String talk(){
return "OLA"
}
}
Class Y implements A{
String hello(){
return "HELLO"
}
}
interface C extends A, B {
void metodo();
}
class D implements C {
void hello(){}
String talk(){};
void metodo(){};
}
class E extends D {
//seus métodos
//como não são métodos abstratos, você não é obrigado a implementa-los, já os mesmos encontra-se
//implementados na classe D
System.out.printiln("A Saida tem que ser :" + super.Y);
}
A Saida tem que ser : HELLO
[/quote]
Fala Renato… cara desculpa estar sendo chato, mas e que ainda nao estou visualizando o seu problema com a solucao que voce quer da… Poderiamos agora simplesmente passar o caminho das Pedras pra vc com a solucao que voce quer… Mas sem saber seu objeto, eu imagino que vc esta indo pelo caminho errado… Veja bem… Eu imaino.
Sugestao: se vc puder fazer um Diagrama de Classes UML de como estao todas as suas classes envolvidas nessa sua solucao e explicar o problema com calma, creio que vai ficar mais facil visualizar e lhe ajudar… Claro, se for viavel…
Vamos lá então.
- Eu tenho várias classes de formulários.
- Todas a classes tem em comum, mensagens de erros, validação de dados de entrada, constantes que os formulários precisam.
- Eu criei uma classe que só me retorna mensagens, outra que só faz validação de dados de entrada e outra que só tem constantes.
- Eu sei que uma classe não pode extender 3 classes, eu sei que não dá para um cadastro de usuário extender uma classe de mensagens outra classe de validação de dados de entrada e ainda constantes.
- Eu queria criar um mecanismo com interfaces para que as classes de formulário sempre herdasse as três classes. Porque uma interfaces pode extender várias interfaces.
Qual solução vou dar? Vou criar um objeto de cada uma das classes que tem dezenas de métodos que eu não vou usar só para usar um método ou replico dois métodos iguais dentro de duas ou três classes, porque tenho 15 fomulários mas só 3 precisa de validar cpf. Posso fazer de várias formas mas .
Mas eh isso que eu estou questionando voce… Seu managed bean nao deve extender classes que facam isso… Ainda acho que voce deve ter 2 Objetos - 1 da classe de validacao e outro da classe de mensagens… as Constantes podes guardar em uma outra classe geral deixando-as static para poderes usar em qualquer lugar. Acho ruim vc querer que seu bean herde as funcoes de validacao e mensagem… desacopla isso cara, senao vais ter teu projeto muito amarrado e depois nao vais aproveitar quase nada desse projeto para projetos futuros… Bom, isso eh a minha opniao… nao vejo vantagem em generalizar 3 classes que tem funcoes completamente diferentes…
Abs
É cara, vou fazer essa solução mesmo obrigadão a vc e a todos do forum, vou criar metodos staticos ja que só retornam resultados.
Cara… ninguem falou em metodos statics… o que foi dito eh que suas contantes podem ser static… seus metodos tem que estar dentro dos objetos de validacao e mensagem… esses Objetos serao gerenciados pelo Heap e poderas usa-los em qualquer parte do seu Projeto…
Evite metodos static a menos que seja em seus utils da vida…
Falows