Clipper On Line • Ver Tópico - SETGET Como funciona em uma classe

SETGET Como funciona em uma classe

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

Moderador: Moderadores

 

SETGET Como funciona em uma classe

Mensagempor asimoes » 09 Fev 2021 22:09

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

SETGET Como funciona em uma classe

Mensagempor JoséQuintas » 09 Fev 2021 23:09

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18113
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1213 vezes

SETGET Como funciona em uma classe

Mensagempor JoséQuintas » 09 Fev 2021 23:23

#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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18113
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1213 vezes

SETGET Como funciona em uma classe

Mensagempor alxsts » 10 Fev 2021 01:34

[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

SETGET Como funciona em uma classe

Mensagempor asimoes » 10 Fev 2021 09:00

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)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

SETGET Como funciona em uma classe

Mensagempor Fernando queiroz » 10 Fev 2021 09:25

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

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
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

SETGET Como funciona em uma classe

Mensagempor asimoes » 10 Fev 2021 12:32

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)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

SETGET Como funciona em uma classe

Mensagempor vcatafesta » 15 Mar 2023 00:44

Poderá usar o SETGET de várias formas:
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!
vcatafesta
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 27
Data de registro: 20 Fev 2015 23:22
Cidade/Estado: Pimenta Bueno/RO
Curtiu: 2 vezes
Mens.Curtidas: 1 vez

SETGET Como funciona em uma classe

Mensagempor ivanil » 15 Mar 2023 08:26

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;

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
    // ***************************************************************************
    // //////////////////////////////////////////////////////////////////////////
    // ***************************************************************************
ivanil
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 119
Data de registro: 11 Set 2004 15:13
Cidade/Estado: Florianópolis/SC
Curtiu: 1 vez
Mens.Curtidas: 12 vezes

SETGET Como funciona em uma classe

Mensagempor vcatafesta » 15 Mar 2023 15:00

JoséQuintas escreveu:
#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:
#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!
vcatafesta
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 27
Data de registro: 20 Fev 2015 23:22
Cidade/Estado: Pimenta Bueno/RO
Curtiu: 2 vezes
Mens.Curtidas: 1 vez




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro