Fecha actual Mar Jul 01, 2025 2:58 pm

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
 Asunto:
NotaPublicado: Lun Nov 21, 2005 10:48 am 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Rodrigo,

Prepara un proyecto y lo reviso.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
NotaPublicado: Lun Nov 21, 2005 12:23 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
Rodrigo Soto escribió:
Saludos....

Sigo practicando... y llego a un punto donde no entiendo lo que pasa o al menos, desconosco si se debe seguir algunas precauciones al trabajar con herencia....

Tengo un clase padre: Padre
//-------------------------------------
Class Padre From TWinControl
Public:
.....
Method Create Constructor
Method Uno
EndClass

//-------------------------------------
Method Create( oParente) Class Padre
.......
Return Self

//-------------------------------------
Method Uno() Class Padre
Return Nil



De lo anterior creo un hijo.... modifico un metodo, agrego un simple dato... apenas solo coloco un dato....

//--------------------------------------------------
Class Hijo From Padre
Public:
Data nVeces <------- aqui

Method Create Constructor
Method Uno
EndClass

//---------------------------------------------------
Method Create Class Hijo
::nVeces := 0 <----- Aqui
Return Self

//-------------------------------------
Method Uno() Class Padre
::nVeces := ::nVeces + 1 <--------- Aqui
Return Nil


y me da el siguiente error
Error BASE/1081 Error de argumento: +
Y aquello es solo por la linea
::nVeces := ::nVeces + 1

Si quito aquella linea el problema desaparece....
¿Pero que tiene de raro aquella linea?

Luego hice lo siguiente:

//-------------------------------------
Method Uno() Class Padre
Qout("Estoy por aca y no entiendo nada...")
Return Nil

y cuando lanzo la aplicacion el mensaje SALE DOS VECES y ¿por que si solo debe salir una sola vez....???


Bueo eso...
Saludos
Rodrigo Soto
Santiago Chile


Hola, Rodrigo, a lo mejor te digo una tontería....

Yo trabajo SIN IDE (no me acostumbro...)
Y tengo clases heredadas a 'mogollón', y funcionan sin problemas.

Lo UNICO que veo raro en tu ejemplo es:

//---------------------------------------------------
Method Create( oOwner ) Class Hijo

Super:Create( oOwner ) // <<<<<<<<< esto falta

::nVeces := 0 <----- Aqui
Return Self


Ya que en tu ejemplo NO INICIALIZAS la clase...

Espero haberte sido de ayuda.

Jesús.

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto:
NotaPublicado: Mar Nov 22, 2005 8:52 am 
Site Admin
Avatar de Usuario

Registrado: Jue Oct 06, 2005 10:49 pm
Mensajes: 655
Ubicación: España - Salamanca
Rodrigo,

Veo que te estás liando tu sólo. Vamos a ver... si creas un objeto de la clase 'hijo' y en el método 'create' de esta clase llamas a 'Super:Create()' subes un nivel en la jerarquía y al entrar en el método 'Create' del padre llamas a 'Metodo01' automáticamente desciendes en la jerarquía hasta 'hijo' porque lo has sobreescrito, por eso ves el primer mensaje, luego al volver a pasar en el método 'Create' del hijo por 'Metodo01'' te vuelve a salir el mensaje. Resumiendo, si sobreescribes un método siempre que se llame en cualquier nivel de la jerarquía descenderá hasta el nivel del objeto para ejecutarlo, a menos que uses 'Super', que es precisamente para indicar que queremos que suba. En tu caso debes poner un Super:Metodo01() en el propio método 'Metodo01' del hijo si quires que se llegue a ejecutar el del padre.

Revisa esto muy, muy despacio, puede llegar a confundir.

_________________
Un saludo,
Bruno Cantero
www.c3compiler.com


Arriba
 Perfil  
Responder citando  
 Asunto:
NotaPublicado: Mié Nov 23, 2005 12:20 pm 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
Rodrigo Soto escribió:
Bruno escribió:
Rodrigo,

Veo que te estás liando tu sólo. Vamos a ver... si creas un objeto de la clase 'hijo' y en el método 'create' de esta clase llamas a 'Super:Create()' subes un nivel en la jerarquía y al entrar en el método 'Create' del padre llamas a 'Metodo01' automáticamente desciendes en la jerarquía hasta 'hijo' porque lo has sobreescrito, por eso ves el primer mensaje, luego al volver a pasar en el método 'Create' del hijo por 'Metodo01'' te vuelve a salir el mensaje.


Resumiendo, si sobreescribes un método siempre que se llame en cualquier nivel de la jerarquía descenderá hasta el nivel del objeto para ejecutarlo, a menos que uses 'Super', que es precisamente para indicar que queremos que suba. En tu caso debes poner un Super:Metodo01() en el propio método 'Metodo01' del hijo si quires que se llegue a ejecutar el del padre.

Revisa esto muy, muy despacio, puede llegar a confundir.

-------------------------------------------------------------------


mmmmm.... :D
debo reconocer que en esto de clases, tengo poco dominio...

Te dire... que no tenia idea para que era aquello de "Super:". Como aquella "palabra", salia en forma reiterativa en la antigua GUI, solo me dedique a copiar sin saber el sentido de dicha sentencia... En ausencia de documentacion... solo queda.. "prueba y error"...


Pues bien, te planteo mi objetivo...
- Deseo heredar desde TPadre, un nuevo objeto que se llamara THijo...
- THijo debe sobreescribir totalmente, varios metodos de TPadre.
- Entre lo metodos a sobreescribir, esta el metodo "Create".
- No deseo hacerme lios, con el asunto de "subir o bajar" en aquello de la jerarquia...


Luego la pregunta...
¿Como THijo, sobrescribe el metodo Create() de TPadre?
--------------------------------------------------------------------

Mira, te aconsejo que SIEMPRE llames al create de TPadre, ya que se puede dar el caso (MUYYYY PROBABLE), que no conozcas toda la información de lo que inicializa el método constructor, por lo que, AUNQUE tu añadas o modifiques datas LLAMA SIEMPRE PRIMERO al create del padre y despues modifica lo que quieras ¿Ok?


Pues bien, deduzco de tus palabras, que culpa de la situacion que describo, esta en el incorporar, en THijo, la siguiente linea que destaco...

//----------------------------------------------------
Method Create( oParent ) Class THijo
Super:Create( oParent ) <--- ESTA LINEA....

// Configuracion general del control ---.
::SetSize( 500, 350)
::TabStop := .T.
::Brush:Color := clWhite

// Metodo solo de prueba ---------------
::Metodo01()
Return Self

Luego...
- ¿Debo quitar dicha linea, asi evito el subir en la jerarquia?

Si quito la linea en cuestion.... me arroja error....
"Error de Proteccion General
- Llamado desde THIJO:BRUSH( 0)....."

Este error SEGURO que es porque no inicializas correctamente el padre. Llama a Super:Create().

De hecho... NO QUIERO subir en la jerarquia, quiero reemplazar o sobreescribir completamente el metodo create de TPadre...

mmmmm.... a ver... lo coloco mas facil...

INSISTO INICIALIZA el padre.


Pregunta....
- ¿THijo, puede sobreescribir el metodo Create de TPadre?

Claro, el create de THijo es el METODO QUE SE EJECUTA, y de ti depende lo que hagas en él.

Si asi fuese....
- ¿Como es que... THijo debe sobreescribr dicho metodo ?

Si como dices añades o quieres modificar datas, este es el lugar.

Ahora ¿Por que deseo sobreescribir el metodo Create de TPadre?
Por que el THijo, incorporara otras datas, otros caculos, en fin... varias otras cosas que no tiene TPadre dentro del metodo en cuestion...

Ya te conteste.

Bueno eso... :D
Saludos
Rodrigo Soto
Santiago - Chile

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron