Duda sobre Herencia de Classes, no hereda valores en DATA

Duda sobre Herencia de Classes, no hereda valores en DATA

Postby Carlos Sincuir » Mon Nov 28, 2005 3: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
Carlos Sincuir
 
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm

Postby fgondi » Mon Nov 28, 2005 3: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:
Code: Select all  Expand view  RUN
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
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Postby Carlos Sincuir » Mon Nov 28, 2005 4: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.:
Code: Select all  Expand view  RUN
#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  Expand view  RUN
#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  Expand view  RUN
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.
Carlos Sincuir
 
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm

Postby fgondi » Mon Nov 28, 2005 5: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:

Code: Select all  Expand view  RUN
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  Expand view  RUN
//--------------------------------
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
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Postby Carlos Sincuir » Mon Nov 28, 2005 5: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:

Code: Select all  Expand view  RUN
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  Expand view  RUN
//--------------------------------
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.
Carlos Sincuir
 
Posts: 38
Joined: Mon Nov 28, 2005 2:10 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 44 guests