publicclassEmployeeImplimplementsEmployee{privateIntegerid;privateStringname;privateWagewage;publicabstractclassEmployeePersistenceStrategyimplementsPersistenceStrategy{publicvoidtest(){id=1;// olha, eu tenho acesso!}publicabstractListgetAllByWage(Doublewage);publicabstractListgetAllByExtra(Doubleextra);publicabstractvoiddeleteAllFired(DateinitialDate,DatefinalDate);}}publicclassEmployeePersistenceStrategyHibernateextendsEmployeeImpl.EmployeePersistenceStrategy{publicEmployeePersistenceStrategyHibernate(){}// implementação dos métodos}
Recebo este erro de compilação na declaração do construtor da EmployeePersistenceStrategyHibernate:
o problema ai esta no modo em como a maquina virtual do java resolve
suas classes…ela simplismente não pode acessar uma classe interna
sem que a mais externa esteja resolvida…
porem se a sua inner class fosse static dai daria certo…mas acho que
classes estaticas não podem ser abstratas…
[]´s dyorgio
_fs
Sim, podem ser estáticas.
Mas desta maneira eu perco o objetivo que é herdar os atributos e métodos de EmployeeImpl. Se é que funciona desse jeito hehe
J
jprogrammer
Cara dá certo sim.
Vc pode ter uma classe estatica e abstrata e pode usa-la por herança.
Também cheguei a uma arquitetura identica a sua depois daquela discussão sobre atributos privados e mecanismos de persistencia.
Fiz um teste e funcionou.
Isso dá certoi sim…
Tenta isso
publicclassEmployeeImplimplementsEmployee{privateIntegerid;privateStringname;privateWagewage;publicstaticabstractclassEmployeePersistenceStrategyimplementsPersistenceStrategy{protectedintid;publicvoidtest(){}// pegue o valor do objeto passadopublicvoidsave(Employeee){this.id=e.id;// olha, eu tenho acesso!}publicabstractListgetAllByWage(Doublewage);publicabstractListgetAllByExtra(Doubleextra);publicabstractvoiddeleteAllFired(DateinitialDate,DatefinalDate);}}publicclassEmployeePersistenceStrategyHibernateextendsEmployeeImpl.EmployeePersistenceStrategy{publicEmployeePersistenceStrategyHibernate(){}// implementação dos métodospublicvoidsave(Employeee){super.save(e);id// tem valor e posso ver]}
_fs
Achei a solução, e aprendi que não acontece o que gostaria.
É necessário declarar o seguinte construtor:
Desse jeito vc faz fazer referencia a uma instancia vazia.
O que importa é ter acesso aos atributos de uma instancia já criada ou criar uma dentro da inner class.
E tem mais tente acessar o id da subclasse;
_fs
Não entendi jprogrammer.
J
jprogrammer
Realmente essa explicação tá uma b…
Mas vc não entendeu o código ou a explicação.
Do jeito que vc colocou a subclasse não tem acesso a variavel privada da outerclass.
Vc tem que acessar os atributos da outerclass de dentro da innerclass agora isso não pode ser através da subclass da innerclass
:shock: (que mer…)
_fs
Sim, entendi que esse é o problema por isso não adianta porcaria nenhuma isso tudo
J
jprogrammer
Também desisti desta meleca.
Ou faz a classe de dominio fazer a persistencia criando um subclasse que implementa as operações essas operações.
Enquanto isso vai ser o DAO e o Domain Model arreganhando tudo…
_fs
Credo
E se eu quiser adicionar outro aspecto? hehe
J
jprogrammer
Como assim?
_fs
Persistencia é um aspecto. Então estendo minha classe Pessoa em PessoaPersistivel.
E se houver outro aspecto? Visualização por exemplo, vou estender novamente? PessoaView extends PessoaPersistivel?
ps.: não sei se aspecto é uma boa palavra aqui.
renatosilva
LIPE, o que acha de implementações de interfaces em vez de extensões de classes?
_fs
Se você me disser como isso resolve o problema, ótimo
J
jprogrammer
Referente a questão da persistencia com atributos protegidos pensei nisso: