SETGET Como funciona em uma classe

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SETGET Como funciona em uma classe

Mensagem por asimoes »

Alguém que entende de criação de classe, poderia me explicar como funciona o SETGET com algum exemplo?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SETGET Como funciona em uma classe

Mensagem por JoséQuintas »

Não olhei os detalhes, mas basicamente o SETGET é usar uma função como se fosse variável.
Isso permite algum tratamento extra nela.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SETGET Como funciona em uma classe

Mensagem por JoséQuintas »

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main

   LOCAL xTela := c():New()

   SetMode( 20, 80 )
   xTela:nRow := 10
   @ Row(), Col() SAY "teste"
   xTela:nRow := 12
   @ Row(), Col() SAY "outro"
   Inkey(0)

   RETURN

CLASS c
   METHOD nRow( xValue ) SETGET
   END CLASS

METHOD nRow( xValue ) Class c

   IF xValue != NIL
      @ xValue, 0 SAY ""
   ENDIF

   RETURN Row()
Usa nRow como variável, mas ela faz mais que uma simples variável.

De repente, pra controles, oControl:BackColor := 127646
E o método BackColor trocaria a cor de fundo do controle.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

SETGET Como funciona em uma classe

Mensagem por alxsts »

[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SETGET Como funciona em uma classe

Mensagem por asimoes »

Desculpa a minha falta de informação, o uso do SETGET seria isso:

::metodo():variavel := "teste" //para SET

teste := ::metodo() //para GET

?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

SETGET Como funciona em uma classe

Mensagem por Fernando queiroz »

asimoes escreveu:Desculpa a minha falta de informação, o uso do SETGET seria isso:

::metodo():variavel := "teste" //para SET

teste := ::metodo() //para GET

?
Não, assim você estaria colocando valores nas variáveis publicas da classe.

desta forma você correria o risco de receber na variável um comando de apagar o banco de dados.
o SET / GET seria uma função para colocar valores nas variáveis PROTECTED: passando por criticas para que isso não aconteça

Código: Selecionar todos

CREATE CLASS CADASTROSCLASS


	METHOD New( ParamServer )   INLINE   ::oServer := ParamServer, Self
	METHOD CADASTROS_MANUTENCAO(  )
	METHOD CADASTROS_PESQUISA_FORNECEDORES(  ) 
	METHOD CADASTROS_PESQUISA_CLIENTES(  )
	METHOD CADASTROS_PESQUISA_CLIENTES_REMOTO( cFilial )
	METHOD CADASTROS_PESQUISA_FUNCIONARIOS(  )

PROTECTED:

	VAR oServer
	VAR cReportOption
	VAR cDefaultPrinter
	VAR nPrinterType

	VAR TIPCLI  			INIT 1
	VAR NRAZ_SOC		
	VAR CPFANT  		
	VAR CPFCGC  		
	VAR INSEST  	
	VAR INSMUN  	
	VAR ISENTO  		
	VAR SUFRAMA 		
	VAR EMAIL   		
	VAR ENDER   		
	VAR NUMERO  		
	VAR COMPLEM 		
	VAR BAIR    		
	VAR CEP     	
	VAR PAIS    			INIT "BRASIL"		
	VAR UF      			INIT "AC"	
	VAR CIDADE  			INIT "RIO BRANCO"
	VAR FONE    		
	VAR CONTATO 		
	VAR DATCAD	 			INIT CTOD("00-00-0000")
	VAR DATALT  			INIT CTOD("00-00-0000")
	VAR LIMCRE  			INIT 0.00
	VAR TOTCRE  			INIT 0.00
	VAR VENBLO  			INIT 1
	VAR FL_CLIENTE			INIT .F.
	VAR FL_FORNECEDOR		INIT .F.
	VAR FL_FUNCIONARIO		INIT .F.
	VAR FL_EXFUNCIONARIO 	INIT .F.
	VAR cRichedit1     		INIT .F.


	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS_CARREGA( PERINI, PERFIN, FORNECEDOR_ID, nTotalVales )
	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS_onDlgInit( oDlg, nTotalVales )
	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS( FORNECEDOR_ID, NRAZ_SOC )
No caso eu teria que criar um metodo para colocar valores nas variaveis protegidas (SET) e outro metodo para pegar o retorno (GET)

https://youtu.be/6wVmqY-CrGM
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SETGET Como funciona em uma classe

Mensagem por asimoes »

Fernando,

Obrigado pela sua explicação, mas não vi o uso de SETGET que a hbclass permite
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
vcatafesta
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 21 Fev 2015 00:22
Localização: Pimenta Bueno/RO
Contato:

SETGET Como funciona em uma classe

Mensagem por vcatafesta »

Poderá usar o SETGET de várias formas:

Código: Selecionar todos

METHOD getName()
   return ::Name

METHOD setName(cName)
   ::Name := cName;

METHOD setgetName(cName)
  if pcount() == 1
      ::Name := cName
   endif
   return ::Name

METHOD Max(nMaxCounter)
  if pcount() == 1
      ::MaxCounter := nMaxCounter
   endif
   return ::MaxCounter

Harbour, C, C++, Ruby, Python, Go, Delphi, Haskell, Html, PHP, mingw, gtwvg, multithread, dbfcdx, letodb
=================================================
Senhor, sem Ti, nada podemos fazer!
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

SETGET Como funciona em uma classe

Mensagem por ivanil »

Caro amigo,

Sugiro que dê uma olhada na documentação para fazer uso do melhor que a Classe pode oferecer, abaixo um exemplo que uso;

Código: Selecionar todos

CREATE CLASS TConfig

    //Ate mesmo as variaveis podem ser controladas a nivel de visibilidade/alteração/Nivel
    DATA Chave        INIT ""
    DATA PATH         INIT ""
    DATA Usuario      INIT ""   ReadOnly  EXPORTED //Guarda o nome do usuario
    DATA Usu          INIT ""   ReadOnly  EXPORTED //Guarda o codigo do usuario criptografado
    ....
    //Get  cTitle := ::Title  //o interessante é que voce pode ate mesmo omitir o Set
    ACCESS Title      INLINE if( TestaVar( '_'+::Name ),GetwindowText( GetFormHandle( ::Name ) ),"" )
    //Set  ::Title := cTitle
    ASSIGN Title( c )   INLINE if( TestaVar( '_'+::Name ),SetwindowText( GetFormHandle( ::Name ), c ),"" )

    DATA cor          INIT  { 212, 208, 200 }
    
    METHOD New()
    METHOD Password()
    
    ENDCLASS
    // ***************************************************************************
    // //////////////////////////////////////////////////////////////////////////
    // ***************************************************************************
vcatafesta
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 21 Fev 2015 00:22
Localização: Pimenta Bueno/RO
Contato:

SETGET Como funciona em uma classe

Mensagem por vcatafesta »

JoséQuintas escreveu:

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main

   LOCAL xTela := c():New()

   SetMode( 20, 80 )
   xTela:nRow := 10
   @ Row(), Col() SAY "teste"
   xTela:nRow := 12
   @ Row(), Col() SAY "outro"
   Inkey(0)

   RETURN

CLASS c
   METHOD nRow( xValue ) SETGET
   END CLASS

METHOD nRow( xValue ) Class c

   IF xValue != NIL
      @ xValue, 0 SAY ""
   ENDIF

   RETURN Row()
Usa nRow como variável, mas ela faz mais que uma simples variável.

De repente, pra controles, oControl:BackColor := 127646
E o método BackColor trocaria a cor de fundo do controle.
Na verdade a proposta do SETGET ou "settergetter" em todas as linguagens é ler e escrever dados encapsulados.
O significado de encapsulamento é garantir que os dados "sensíveis" são ocultados dos usuários.
Para conseguir isso, você deve declarar variáveis/atributos de classe como private(não pode ser acessado de fora da classe).
Se você quiser que outras pessoas leiam ou modifiquem o valor de um membro privado, você pode fornecer get público e definir métodos.

Da forma exposta pelo cavalheiro, esse teu código não se presta tal para proposta, em vista da implementação equivocada diante da proposta do SETGET.
Nesse teu caso, o METHOD nrow() está trabalhando como uma função normal.
O correto nessa implementação seria basicamente assim:

Código: Selecionar todos

#include "hbclass.ch"

function main()
   LOCAL xTela := c():New()

   //SetMode(20, 80)
   Scroll()
   SetPos( 0, 0 )

   @ xTela:Getrow, Col() SAY "1st teste" // row foi definido em 10 default na criação da classe

   xTela:setRow(11) // ou xTela:setgetRow(10)
   @ xTela:Getrow, Col() SAY "2nd teste"

   xTela:setRow(12) // ou xTela:setgetRow(12)
   @ xTela:getRow, Col() SAY "3th teste"

   inkey(0)
   // linha abaixo somente para mostrar o erro ao acessar variável privada/hidden
   @ xTela:Row,      Col() SAY "outro" // Error BASE/41  Scope violation (hidden): C:ROW
   return nil

CLASS c
   HIDDEN:
      VAR row INIT 10
   EXPORTED:
      METHOD setgetRow(xValue) SETGET
      METHOD setRow(xValue) SETGET
      METHOD getRow() SETGET
END CLASS

METHOD setgetRow(xValue) Class c
   IF xValue != NIL
      ::row := xValue
   ENDIF
   return ::row

METHOD setRow(xValue) Class c
   IF xValue != NIL
      ::row := xValue
   ENDIF

METHOD getRow(xValue) Class c
   return ::row
Harbour, C, C++, Ruby, Python, Go, Delphi, Haskell, Html, PHP, mingw, gtwvg, multithread, dbfcdx, letodb
=================================================
Senhor, sem Ti, nada podemos fazer!
Responder