Página 1 de 1

Classes - Harbour - > Declaracao de variaveis.

Enviado: 01 Set 2012 00:38
por mateus301
Ola, hoje pela orientação a objetos no harbour temos varios tipois de declaraçoes de variaveis... Segue um exemplo :

Código: Selecionar todos

CLASS Usuario

   EXPORTED:
   VAR cName AS STRING INIT Space( 10 )

   METHOD Login()

   HIDDEN:

   METHOD DigitaSenha()
   METHOD SenhaInvalida()
   METHOD CadastraUserNew()
	METHOD GravaNovoUsuario()
	METHOD setNome()
	METHOD MostraNomeDoUsuario()

   VAR cSenha           AS STRING  INIT Space( 0 )
   VAR nCodigo          AS NUMERIC INIT 0
   VAR aArray           AS ARRAY    INIT {}
// VAR oTela AS OBJECT ?????????
	
ENDCLASS
como perceberam a parte comentada do codigo "VAR oTela AS OBJECT ?????????"... gostaria de saber como posso declarar meu objetos, do mesmo jeito que declaro os array e numericos no escopo da classe.

Nao esta dando problema isso porque o harbour aceita q eu nao coloque o tipo mas é uma duvida que esta me matando. VLW

Classes - Harbour - > Declaracao de variaveis.

Enviado: 01 Set 2012 02:49
por alxsts
Olá!

Não testei. Teste:

Código: Selecionar todos

VAR oTela AS HBObject():New()
HBObject() é a classe base de todas as classes.

Classes - Harbour - > Declaracao de variaveis.

Enviado: 01 Set 2012 11:42
por Imatech
Olá mateus301, alxsts !
.
.
.
Por favor, estudem o exemplo abaixo:
.
.
.
..\tests\clsdata.prg

Código: Selecionar todos


/*
 * $Id: clsdata.prg 17835 2012-07-18 13:41:31Z vszakats $
 */

PROCEDURE Main()

   LOCAL o := HBObject():New()

   QOut( "o:Data1 => ", o:Data1 )
   QOut( "o:ClassData1 => ", o:ClassData1 )
   QOut( "o:Data2 => ", o:Data2 )
   QOut( "o:ClassData2 => ", o:ClassData2 )
   o:Test()

   RETURN

FUNCTION TBaseObject()

   STATIC oClass

   IF oClass == NIL
      oClass := HBClass():New( "TBaseObject" )
      oClass:AddData( "Data1" )
      oClass:AddClassData( "ClassData1" )
      oClass:AddMethod( "NewBase", @NewBase() )
      oClass:AddMethod( "Test", @Test() )
      oClass:AddMethod( "Method1", @Method1Base() )
      oClass:AddMethod( "Method2", @Method2Base() )
      oClass:Create()
   ENDIF

   RETURN oClass:Instance()

STATIC FUNCTION NewBase()

   LOCAL self := QSelf()

   ::Data1 := 1
   ::ClassData1 := "A"

   RETURN self

STATIC FUNCTION Test()

   LOCAL self := QSelf()

   QOut( "Inside ::Test() " )
   QOut( "calling ::Method1() " )
   ::Method1()

   RETURN self

STATIC FUNCTION Method1Base()

   LOCAL self := QSelf()

   QOut( "I am Method1 from TBaseObject" )
   ::Method2()

   RETURN self

STATIC FUNCTION Method2Base()

   LOCAL self := QSelf()

   QOut( "I am Method2 from TBaseObject" )

   RETURN self

FUNCTION HBObject()

   STATIC oClass

   IF oClass == NIL
      oClass := HBClass():New( "HBObject", "TBaseObject" )
      oClass:AddData( "Data2" )
      oClass:AddClassData( "ClassData2" )
      oClass:AddMethod( "New", @New() )
      oClass:AddMethod( "Method1", @Method1() )
      oClass:AddMethod( "Method2", @Method2() )
      oClass:Create()
   ENDIF

   RETURN oClass:Instance()

STATIC FUNCTION New()

   LOCAL self := QSelf()

   ::TBaseObject:NewBase()
   ::Data1 := 1
   ::ClassData1 := "A"
   ::Data2 := 2
   // ClassData2 override ClassData1
   ::ClassData2 := "B"

   RETURN self

STATIC FUNCTION Method1()

   LOCAL self := QSelf()

   QOut( "I am Method1 from HBObject" )
   ::TBaseObject:Method1()

   RETURN self

STATIC FUNCTION Method2()

   LOCAL self := QSelf()

   QOut( "I am Method2 from HBObject" )

   RETURN self

Olá mateus301, alxsts !

Classes - Harbour - > Declaracao de variaveis.

Enviado: 01 Set 2012 17:02
por mateus301
Ola alxsts e Imatech ! Primeiramente quero agradecer pelas respostas.

alxsts , tentei oq vc disse, mas infelizmente nao obtive sucesso, nem compilou. XD
Imatech, analisei o codigo que voce colocou ai, mas nao achei a resposta que estava procurando. Percebi que isso é como o harbour trata a HBObject().

Aguardo a ajuda de voces Obrigado.

Classes - Harbour - > Declaracao de variaveis.

Enviado: 01 Set 2012 19:16
por JoséQuintas
Também briguei um pouco com isso, mas acabei adotando o New(). Motivos:

- Não dá pra criar uma classe de objetos diretamente em inicialização
- Fica fácil identificar o uso de uma classe. Se procurar nos fontes :New() vai encontrar facilmente a criação (apesar que não pode existir uma classe e uma função com nomes iguais)
- E pra ficar usando cada vez de um jeito, melhor usar sempre de um jeito só: New() que sempre funciona

Já vi em alguns fontes Initialize() ou algo assim, não sei se houve alguma mudança pra pegar automático com este nome.

Classes - Harbour - > Declaracao de variaveis.

Enviado: 09 Mar 2020 18:51
por alxsts
Olá!

O tempo passa mas ensina. Creio que a resposta esperada era

Código: Selecionar todos

 VAR oTela INIT TAlgumaClasse():New()

Classes - Harbour - > Declaracao de variaveis.

Enviado: 10 Mar 2020 08:37
por bencz

Código: Selecionar todos

CLASS Usuario

PUBLIC:
   METHOD NEW() CONSTRUCTOR

   // ........
   VAR oTela INIT NIL
   
ENDCLASS

METHOD NEW() CLASS USUARIO
   ::oTELA := ClasseTela():New()
RETURN SELF