FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Duda sobre Herencia de Classes, no hereda valores en DATA
Posts: 38
Joined: Mon Nov 28, 2005 02:10 PM
Duda sobre Herencia de Classes, no hereda valores en DATA
Posted: Mon Nov 28, 2005 03:03 PM

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

Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Duda sobre Herencia de Classes, no hereda valores en DATA
Posted: Mon Nov 28, 2005 03:19 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:
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 Sistemas Informáticos
Posts: 38
Joined: Mon Nov 28, 2005 02:10 PM
Duda sobre Herencia de Classes, no hereda valores en DATA
Posted: Mon Nov 28, 2005 04:01 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.:
#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



#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:
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.
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Duda sobre Herencia de Classes, no hereda valores en DATA
Posted: Mon Nov 28, 2005 05:03 PM
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:

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:
//-------------------------------- 
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 Sistemas Informáticos
Posts: 38
Joined: Mon Nov 28, 2005 02:10 PM
Duda sobre Herencia de Classes, no hereda valores en DATA
Posted: Mon Nov 28, 2005 05:08 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

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:

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:
//-------------------------------- 
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.

Continue the discussion