Ola a todos,

Alguem ja tentou utilizar a clausula super() dentro de um metodo, depois 
criar uma nova classe herdando a que implementou o metodo e chamar este 
metodo a partir desta nova classe ? Por exemplo :

public class Obj {

  public int toPersistent() {
    //nenhum codigo aqui, usada apenas para não gerar erro de compilacao no 
metodo toPersistent da classe Obj por causa do uso da clausula super()
    return 0;
  } 
}

public class Resource extends Obj {
  public int ID; //sem usar encapsulamento para facilitar o exemplo

  public int toPersistent() {
   //o codigo da rotina de persistencia é todo implementado aqui !!! 
   //a ideia é implementar toda a rotina de persistencia uma unica vez
   //e utiliza-la para todas as classes filhas sem reimplementar novamente  
para cada filho
   //utilizando o mecanismo de reflexao para descobrir os campos da 
   //instancia do filho onde foi invocada e usando o super() para 
   //persistir a classe exatamente superior antes de persistir a si mesmo 
   //por causa da integridade referencia usada no RDBMS.

   if (...) // Se o metodo esta sendo executado dentro de qualquer filho
     int idSuper = super();  //persistente o pai antes de persistir a si 
mesmo
   }

   // rotina de gravacao desta instancia aqui !!!
   return idThis; //retorna o ID desta instancia dentro do DB usado na 
gravacao do filho para efeito de integridade referencial
  }
}

public class Person extends Resource {
  public String Nome; //sem usar encapsulamento para facilitar o exemplo
}

public class Employ extends Person {
  public String Depto;
}

...
Employ e = new Employ();
e.ID = 100;
e.Nome = "Billy Joy";
System.out.println("ID???:"+e.toPersistent());
...

Conclusao...

Segundo o conceito de heranca (se eu estiver errado por favor me 
corrijam...), um metodo herdado deve se comportar como se ele estive sido 
implementado fisicamente dentro da classe, sendo transparente para o 
usuario os detalhes e a classe onde foi fisicamente implementado.

Li em algum lugar que a JVM trabalha com "ligamento dinamico", no caso de 
polimorfismo e herança para determinar qual ou onde o metodo deve ser 
chamado em runtime, porem neste caso isso não funcionou para super() pois 
independente de onde se chame o metodo a clausula super assume como 
referencia a classe onde foi fisicamente implementada, neste caso a 
classe "Resource", desta forma não consegui fazer com que super() se 
referencie a classe pai de onde esta sendo invocada.

Pelo que entendi o compilador faz uma ligacao fisica do filho com a classe 
pai no caso da clausula super() (e no restante uma ligacao dinamica !?!?), 
isso faz com que a resolucao da clausula super pela JVM tome como 
referencia o metodo onde foi implementado e não de onde foi invocada para 
determinar quem é o pai da classe onde o metodo esta sendo invocado !!!!

Será que isso é pra ser assim mesmo ou temos ai talvez uma falha de 
conceito, ou talvez um bug do compilador...

Alguem poderia comentar o assunto ?

Alessandro.


------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a