¿Herencia?

Iniciado por Proteus1989, 3 Junio 2012, 14:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Proteus1989

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 (java) [Seleccionar]

Nota a = new Nota()
{
@Override
public String toString()
{
return nota;
}
};


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 (java) [Seleccionar]

Nota a = new Nota()
{
public double notaSobre1()
{
return nota*0.10;
}
};


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?

Gallu

Estás seguro que no lo puedes llamar ?

Código (java) [Seleccionar]

class Nota{
public double nota = 1;
}
public class Test{
public static void main(String... arg){
(new Nota(){
public double notaSobre1(){
System.out.println("Entramos en el metodo");
return nota*0.10;
}
}).notaSobre1();
}
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Proteus1989

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 (java) [Seleccionar]

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


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 (java) [Seleccionar]

Nota a = new Nota();
Nota b = new NotaExtendida();

b.metodosDeNota(); // No puedo acceder a los métodos de NotaExtendida



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.

Gallu

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 .
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Proteus1989

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.