Duda sobre Herencia de Classes, no hereda valores en DATA

Post Reply
Carlos Sincuir
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm

Duda sobre Herencia de Classes, no hereda valores en DATA

Post by Carlos Sincuir »

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
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post by fgondi »

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:

Code: Select all

METHOD New() CLASS TSegunda 
Super:New()
RETURN Self
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.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Carlos Sincuir
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm

Post by Carlos Sincuir »

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:

Code: Select all

METHOD New() CLASS TSegunda 
Super:New()
RETURN Self
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.
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post by fgondi »

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:

Code: Select all

aArray   := {'Pepe', 'Pedro', 'Carlos'}
aArray1 := aClone(aArray)
aArray[1] := 'Luis'
aArray2 := aClone(aArray)
? aArray[1]  // Luis
? aArray[2] // Pepe
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:

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
Ya no te haría falta declarar la clase TSegunda como hija de TPrimera.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Carlos Sincuir
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm

Post by Carlos Sincuir »

Gracias Fernando, eso es lo que creo que voy a tener que hacer, muchas gracias por tomarte el tiempo en contestarme.

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:

Code: Select all

aArray   := {'Pepe', 'Pedro', 'Carlos'}
aArray1 := aClone(aArray)
aArray[1] := 'Luis'
aArray2 := aClone(aArray)
? aArray[1]  // Luis
? aArray[2] // Pepe
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:

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
Ya no te haría falta declarar la clase TSegunda como hija de TPrimera.
Post Reply