Estoy trabajando una clase que contiene DATAS y METHODS principales para una aplicación, pero al generar la siguiente clase que hereda de esta, solo hereda los METHODS pero no los datos asignados a las DATAS ?
A continuación les pongo un ejemplo, para que me puedan decir que estoy haciendo mal. Gracias.
Carlos Sincuir
****PROGRAMA 1
#Include "FiveWin.ch"
//--------------------------------
FUNCTION Main()
Local oApp, oSeg
oApp := TPrincipal():New()
? oApp:cVersion //Despliega "Versión 1.0.1" <--todo bien
oSeg := TSegunda():New()
oSeg:Hola() //Despliega el mesaje "Hola..." <--todo bien
? oSeg:cVersion //No despliega nada en el diálogo
? ValType( oSeg:cVersion ) // Despliega "U" o variable no definida
RETURN NIL
//--------------------------------
CLASS TPrincipal
DATA lIngreso
DATA cVersion
METHOD New CONSTRUCTOR
METHOD Hola
ENDCLASS
//--------------------------------
METHOD New() CLASS TPrincipal
::lIngreso := .f.
::cVersion := "Versión 1.0.1"
RETURN Self
//--------------------------------
METHOD Hola() CLASS TPrincipal
MsgAlert( "Hola..." )
RETURN NIL
****PROGRAMA 2
#Include "FiveWin.ch"
//--------------------------------
CLASS TSegunda FROM TPrincipal
METHOD New() CONSTRUCTOR
ENDCLASS
//--------------------------------
METHOD New() CLASS TSegunda
RETURN Self
Duda sobre Herencia de Classes, no hereda valores en DATA
-
- Posts: 38
- Joined: Mon Nov 28, 2005 2:10 pm
Hola carlos,
La llamada al método New() de la clase TSegunda no provoca la llamada al mismo método de la clase padre. Tienes que hacer tu que se llamara:
o bien no definas el método New() dentro de la clase TSegunda. De esa forma la llamada a oSeg:New() lo realizará al new de TPrimera.
La llamada al método New() de la clase TSegunda no provoca la llamada al mismo método de la clase padre. Tienes que hacer tu que se llamara:
Code: Select all
METHOD New() CLASS TSegunda
Super:New()
RETURN Self
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Fernando González Diez
ALSIS GHE Sistemas Informáticos
-
- Posts: 38
- Joined: Mon Nov 28, 2005 2:10 pm
Gracias fgondi,
Al agregar Super:New() en el Method New() de la segunda clase ya funciono, pero ahora tengo este otro problema, si te fijas yo coloque otra varible como DATA en TPrincipal esa es lIngreso, que al inicio tiene un valor .f., pero como en la clase principal hago el proceso de ingreso al sistema, esta variable puede cambia de valor, si todo esta bien a .t., pero en la segunda siempre tendrá el valor .f.
Como se podrá arreglar esto.
Saludos,
Carlos Sincuir
Ej.:Code: Select all
#Include "FiveWin.ch" //-------------------------------- FUNCTION Main() Local oApp, oSeg oApp := TPrincipal():New() oApp:Ingreso() ? oApp:lIngreso // Obtego .t. oSeg := TSegunda():New() ? oSeg:lIngreso //Obtengo .f. RETURN NIL //-------------------------------- CLASS TPrincipal DATA lIngreso DATA cVersion METHOD New CONSTRUCTOR METHOD Hola METHOD Ingreso ENDCLASS //-------------------------------- METHOD New() CLASS TPrincipal ::lIngreso := .f. ::cVersion := "Versión 1.0.1" RETURN Self //-------------------------------- METHOD Hola() CLASS TPrincipal MsgAlert( "Hola..." ) RETURN NIL //-------------------------------- METHOD Ingreso() CLASS TPrincipal ::lIngreso := .t. RETURN NIL
Code: Select all
#Include "FiveWin.ch" //-------------------------------- CLASS TSegunda FROM TPrincipal METHOD New() CONSTRUCTOR ENDCLASS //-------------------------------- METHOD New() CLASS TSegunda Super:New() RETURN Self
fgondi wrote:Hola carlos,
La llamada al método New() de la clase TSegunda no provoca la llamada al mismo método de la clase padre. Tienes que hacer tu que se llamara:o bien no definas el método New() dentro de la clase TSegunda. De esa forma la llamada a oSeg:New() lo realizará al new de TPrimera.Code: Select all
METHOD New() CLASS TSegunda Super:New() RETURN Self
Hola Carlos,
Son objetos distintos y por tanto no pueden traspasarse valores.
Cada vez que creas un objeto este es totalmente indipendiente del resto que hayas creado, es como si crearas lo siguiente:
Lo que haces es crear un nuevo objeto con los datos iniciales.
Revisa que es lo que te interesa hacer, una solución, chapucera, es meter un objeto dentro del otro, por ejemplo:
Ya no te haría falta declarar la clase TSegunda como hija de TPrimera.
Son objetos distintos y por tanto no pueden traspasarse valores.
Cada vez que creas un objeto este es totalmente indipendiente del resto que hayas creado, es como si crearas lo siguiente:
Code: Select all
aArray := {'Pepe', 'Pedro', 'Carlos'}
aArray1 := aClone(aArray)
aArray[1] := 'Luis'
aArray2 := aClone(aArray)
? aArray[1] // Luis
? aArray[2] // Pepe
Revisa que es lo que te interesa hacer, una solución, chapucera, es meter un objeto dentro del otro, por ejemplo:
Code: Select all
//--------------------------------
FUNCTION Main()
Local oApp, oSeg
oApp := TPrincipal():New()
oApp:Ingreso()
? oApp:lIngreso // Obtego .t.
oSeg := TSegunda():New()
oSeg:oApp := oApp
? oSeg:oApp:lIngreso //Obtengo .t.
RETURN NIL
#Include "FiveWin.ch"
//--------------------------------
CLASS TSegunda
DATA oApp
METHOD New() CONSTRUCTOR
ENDCLASS
//--------------------------------
METHOD New() CLASS TSegunda
RETURN Self
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Fernando González Diez
ALSIS GHE Sistemas Informáticos
-
- Posts: 38
- Joined: Mon Nov 28, 2005 2:10 pm
Gracias Fernando, eso es lo que creo que voy a tener que hacer, muchas gracias por tomarte el tiempo en contestarme.
Saludos,
Carlos Sincuir
Saludos,
Carlos Sincuir
fgondi wrote:Hola Carlos,
Son objetos distintos y por tanto no pueden traspasarse valores.
Cada vez que creas un objeto este es totalmente indipendiente del resto que hayas creado, es como si crearas lo siguiente:
Lo que haces es crear un nuevo objeto con los datos iniciales.Code: Select all
aArray := {'Pepe', 'Pedro', 'Carlos'} aArray1 := aClone(aArray) aArray[1] := 'Luis' aArray2 := aClone(aArray) ? aArray[1] // Luis ? aArray[2] // Pepe
Revisa que es lo que te interesa hacer, una solución, chapucera, es meter un objeto dentro del otro, por ejemplo:Ya no te haría falta declarar la clase TSegunda como hija de TPrimera.Code: Select all
//-------------------------------- FUNCTION Main() Local oApp, oSeg oApp := TPrincipal():New() oApp:Ingreso() ? oApp:lIngreso // Obtego .t. oSeg := TSegunda():New() oSeg:oApp := oApp ? oSeg:oApp:lIngreso //Obtengo .t. RETURN NIL #Include "FiveWin.ch" //-------------------------------- CLASS TSegunda DATA oApp METHOD New() CONSTRUCTOR ENDCLASS //-------------------------------- METHOD New() CLASS TSegunda RETURN Self