Incoherencias en Codigos...

Iniciado por Skeletron, 21 Septiembre 2009, 02:11 AM

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

Skeletron

Hola gente...
Estoy leyendo un libre de JAva, y habla de las clases FINAL..

Y dice que las clases FINAL, se establecen FINAL, para que no puedan ser heredadas de ninguna otra clase...
pero.. Si sos un programador, y estas programando TU programa.. y no queres que se herede una clase.. simplemente:
NO HEREDES...

Entonces... leo que dice el libro:
"En algunas ocasiones, es necesario evitar que alguien contruya una sublase a partir de una de nuetras clases."

Pero... QUE LOCURA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Si no queres que una clase creada POR VOS, sea heredada, entoces NO ESCRIBAS EXTENDS en inguna otra clase Y LISTO!!!!!!
¬¬

O demos el 2º caso de ésto:
EL libro dice así MISMO:
"¿Que ocurre si intentamos refundir en un puinto de una cadena de herencia y estamos "mientiendo" acerca de lo que contiene un objeto?"
Y dan éste ejemplo:
Administrador jefe = (Administrador) persona[1]; //(ésto daría error)

Y recomiendan ahcer ésto para evitar que "catcheemos" mal a una clase:

if ( persona[1] instanceof Administrador ){
jefe = (administracion) personal[1];
}

O sea....
Ese codigo lo que hace, es corroborar si estamos "chatcheando" bien.. sino, no hace lo que queremos..

Pero..

COMO NO VOY A SABER QUE TIPO O NOMBRE DE CLASE ES LA QUE ESTOY CREANDO, SI YO MISMO HE CREADO AL PROGRAMA?!?!?!?!?

egyware

A pesar que tengo poco tiempo y mañana tengo certamen de Calculo 3 igual te constesto porque dices cosas un poco locas.
Primero que nada el libro te enseña el lenguaje.
Segundo los ejemplos que te dan sirven para cuando tu usas una libreria o creas una.
Por ejemplo:
Tienes una libreria con una  clase que se conecte a tu correo usando STMP (prodria ser POP3,etc...), osbiamente la clase funciona bien tal como esta y la hacen final para que nadie la modifique ni por casualidad.
Igual tu creas una clase que funciona bien tal como esta, y la distribuyes por la internet, no querras que algun tonto hereda tal clase y despues de postea que la cosa no funciona?.
Bueno eso queria postear poco y me exedi un poco.
Sobre revizar si la clase es o no objeto eso es util con la reflección, pero deben darte un ejemplo para NOVATOS para que lo entiendas mejor.
Me despido creo que me emocione un poco escribiendo.
Adios
Tengo que estudiar

Anibal784

estoy de acuerdo con lo que dice egyware, aunque no se, para mi el hecho de final es restrictivo y poco práctico (digamos así, con eso, ¿para qué corno se usa POO para hacer el programa?), ahora se me ocurre un escenario:
supongamos que creas una librería que tiene clases, pero una de esas clases es sensible, y que algunos de sus métodos deben hacer lo que tu quieres, si permites heredar esa clase, alguien podría sobreescribir esos métodos y pasarle a tu clase como parámetro, con lo cual podría generarse un fallo de, digamos, seguridad.

Luego, no es "chatcheando", sino "castear" (de cast) y si [ab]usas de cast en POO, significa que encaraste mal el problema, en caso de que no te quede otra y si o si necesites hacer cast, haz como se te indica, tu como programador puedes llegar a saber que en persona[1] está siempre el administrador, pero ¿estás seguro de saber qué es lo que hay en el resto?, si supieras qué tipo de objeto tienes, no usarías un arreglo de una clase genérica sino una variable de la clase concreta.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

Skeletron

Es verdad..
Es verdad..
Era CASTEO.. es que desde chico me quedó el CATCHEO de Try Catch, y no me lo puedo quitar..

Pero.. Insisto...
Para que colocar algo para que no se pueda heredar la clase?? es mas facil NO HEREDARLA Y PUNTO.. AUNQUE... lo que dijo agyware es TOTALEMENTE REAL, y no se me habia ocurrido...

Pero por dios..
if ( persona[1] instanceof Administrador ){
jefe = (administracion) personal[1];
}
ESO ES TOTALMENTE ILOGICO......
A no ser que el casteo sea por una variable.. o sea: jefe=(variable) peronal[1]...
Pero sino.. PARA QUE VOY A QUERER COMPROBAR ALGO, que se puede hacer MIRANDO!

BEATMASTER

pues pasa que las computadoras no miran y aunque nosotrso veamos algo en codigo de momento yo no se que contendra persona[1] que tal si alguien irresponsablemente uso a persona[1] como instancia de alguna otra cosa que no sea Administrador? y una clase final es porque si yo hago una clase y no quiero que tu le emtas mano ni la heredes pes la hago final OJO que la decicion de que TU no la heredes es mia si tu no queires heredarla no lo haras y esta bien pero si quisieras yo por ahcerla final te lo impediria talvez no le veas mucho uso pero hay cosas que lo nececitan sobre todo para garantizar la integridad y el correcto funcionamiento de algo

Anibal784

Citar
Pero sino.. PARA QUE VOY A QUERER COMPROBAR ALGO, que se puede hacer MIRANDO!
Tal como dijeron, las computadoras no mira, ésto es equivalente a mirar para una computadora.
Código (java) [Seleccionar]

if ( persona[1] instanceof Administrador ){
   // codigo
}

aunque insisto en que si [ab]usas de ese tipo de construcciones, mejor mira el diseño y encara para otro lado pues le pifiaste, no haces uso de ninguna facilidad que ofrece la POO.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

-Ramc-

Ellos te han intentado explicar varias cosas, pero, esto es básico si hubieras leido algún manual que te explique la POO, tienes muchas lagunas.

He visto que programas en otros lenguajes y las validaciones son comunes en cualquiera, si no quieres validar, no deberías pedir entradas de usuario o compartir tus paquetes como quieres en otros temas.

Saludos.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

Skeletron

Amigos....

A ver....

No entienden algo que les quiero explicar...

Ahí dice que si la comprobacion es correcta, o sea, que las clases "coinciden", que se haga lo que quiero que haga..

No es mas facil girar la cabeza unos 13 grados a la izquierda en el NetBens y mirar como se llama la clase?

-Ramc-

Eso está bien cuando usted creó todo el arbol de clases, pero, qué pasa cuando tiene una clase de un tercero y no tiene el código de fuente y quiere saber si su objeto implementa una interfaz o por ejemplo está haciendo un administrador de diseño y quiere saber cuantos botones hay agregados o quiere saber qué objeto es tipo JMenu para agregarlo hasta arriba o JStatusBar, etc.

Saludos.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

juancho77

CitarPero por dios..
if ( persona[1] instanceof Administrador ){
jefe = (administracion) personal[1];
}
ESO ES TOTALMENTE ILOGICO......
A no ser que el casteo sea por una variable.. o sea: jefe=(variable) peronal[1]...
Pero sino.. PARA QUE VOY A QUERER COMPROBAR ALGO, que se puede hacer MIRANDO!

No siempre puedes mirar como estan implementadas las clases. Por ejemplo, suponte que alguien te da la clase Stock, y te provee una interfaz para usarla que solo tiene el método obtenerComponentesEnStock() que retorna componentes de una computadora. Los componentes pueden ser Gabinete, Monitor, Teclado, etc, pero te los devuelve como Componentes. Es decir, todos extienden a Componente, por ejemplo.
En tu programa, dado que no sabes que recibes, querrás chequear si un Componente dado es un Monitor. Entonces, recorres la lista retornada por Stock:

Código (java) [Seleccionar]
for (Component c: objetoStock.obtenerComponentesEnStock()){
 if (c instanceof Monitor)
   //hacer algo
 else if (c instanceof Teclado)
   //hacer algo
 //etc
}


Lo mismo te puedo decir para una clase dibujadora (tipo Paint) o en tu caso, ese arreglo contiene Personas. Pero Personas puede hacer referencia, todo en un mismo arreglo, a Administradores, Brujos, Fumadores de Opio, Universitarios, Tolo's Gallego, etc.
Se entiende?
Un saludo.