Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Proteus1989 en 3 Junio 2012, 14:58 pm



Título: ¿Herencia?
Publicado por: Proteus1989 en 3 Junio 2012, 14:58 pm
El otro día me dio por pensarlo y desde entonces no he logrado nada.

Todos sabemos que podemos hacer una llamada a un constructor y en la misma instanciación modificar uno o más métodos.
Algo así:

Código
  1. Nota a = new Nota()
  2. {
  3. @Override
  4. public String toString()
  5. {
  6. return nota;
  7. }
  8. };
  9.  

Creo que esto está permitido gracias a la herencia de Java, ya que la variable nota tiene que estar protegida y no ser privada para poder hacer uso de ella.
Resumiendo creo que con eso estamos haciendo un extends de Nota y guardandolo en una declaración Nota.

El dilema que me surge a mi es que pasa si en lugar de @Override yo añado un método nuevo que no pertenece a la clase nota
Es decir:

Código
  1. Nota a = new Nota()
  2. {
  3. public double notaSobre1()
  4. {
  5. return nota*0.10;
  6. }
  7. };
  8.  

El compilador me deja hacerlo sin embargo Nota no sabe que ese método existe y por tanto nunca se podrá hacer uso de él.
Y mi pregunta es, si no puede ser llamado nunca ¿porque te deja crearlo?


Título: Re: ¿Herencia?
Publicado por: Gallu en 3 Junio 2012, 20:48 pm
Estás seguro que no lo puedes llamar ?

Código
  1. class Nota{
  2. public double nota = 1;
  3. }
  4. public class Test{
  5. public static void main(String... arg){
  6. (new Nota(){
  7. public double notaSobre1(){
  8. System.out.println("Entramos en el metodo");
  9. return nota*0.10;
  10. }
  11. }).notaSobre1();
  12. }
  13. }
  14.  


Título: Re: ¿Herencia?
Publicado por: Proteus1989 en 3 Junio 2012, 21:17 pm
Pero tu haces trampa xD

Tu lo declaras y lo usas sin guardarlo en una variable. Yo al guardarlo en una variable pierde las propiedades nuevas.

Para que me entiendas

Código
  1. Nota a = new Nota();
  2. a.metodosDeNota(); // En este caso solo tengo acceso a los métodos de la variable
  3. new Nota(){metodos}; En este tengo acceso a los métodos de la instanciación.
  4.  

Si tu guardas un objeto que extiende de otro en una variable del tipo no extendido no puedes hacer uso de los métodos de la extendida.
Es decir

Código
  1. Nota a = new Nota();
  2. Nota b = new NotaExtendida();
  3.  
  4. b.metodosDeNota(); // No puedo acceder a los métodos de NotaExtendida
  5.  
  6.  

Viendo lo que has escrito el único razonamiento lógico que veo es el poder extender rápidamente de una clase que necesitas una sola vez y que inmediatamente va a desaparecer.


Título: Re: ¿Herencia?
Publicado por: Gallu en 3 Junio 2012, 22:32 pm
He respondido a la pregunta que planteaste
"Y mi pregunta es, si no puede ser llamado nunca ¿porque te deja crearlo?"

Son clases anónimas , entre otras cosas sirven para la gestión de eventos.
http://es.scribd.com/walter_ortiz_9/d/50787986/33-Clases-anonimas-en-la-gestion-de-eventos

Lo que comentas está ligado al polimorfismo más que a la herencia .


Título: Re: ¿Herencia?
Publicado por: Proteus1989 en 3 Junio 2012, 23:14 pm
Pues eso digo, que lo único plausible es hacerlo de la forma que has puesto tu anteriormente.
Y cierto, es polimorfismo.

Pues nada, duda solucionada.
Gracias tío.