SETGET Como funciona em uma classe
Moderador: Moderadores
SETGET Como funciona em uma classe
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)
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)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
SETGET Como funciona em uma classe
Não olhei os detalhes, mas basicamente o SETGET é usar uma função como se fosse variável.
Isso permite algum tratamento extra nela.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
SETGET Como funciona em uma classe
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()
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/
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
SETGET Como funciona em uma classe
Olá!
Desde o Clipper 5.0 usa-se muito está técnica na forma.
https://www.w3schools.com/java/java_encapsulation.asp#:~:text=The%20get%20method%20returns%20the%20value%20of%20the%20variable%20name,refer%20to%20the%20current%20object.
Desde o Clipper 5.0 usa-se muito está técnica na forma
Código: Selecionar todos
{ |x| if( x != NIL, y := x, y ) }https://www.w3schools.com/java/java_encapsulation.asp#:~:text=The%20get%20method%20returns%20the%20value%20of%20the%20variable%20name,refer%20to%20the%20current%20object.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
SETGET Como funciona em uma classe
Desculpa a minha falta de informação, o uso do SETGET seria isso:
::metodo():variavel := "teste" //para SET
teste := ::metodo() //para GET
?
::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)
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

- Mensagens: 779
- Registrado em: 13 Nov 2014 00:41
- Localização: Porto Alegre/RS
SETGET Como funciona em uma classe
Não, assim você estaria colocando valores nas variáveis publicas da classe.asimoes escreveu:Desculpa a minha falta de informação, o uso do SETGET seria isso:
::metodo():variavel := "teste" //para SET
teste := ::metodo() //para GET
?
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 )https://youtu.be/6wVmqY-CrGM
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
SETGET Como funciona em uma classe
Fernando,
Obrigado pela sua explicação, mas não vi o uso de SETGET que a hbclass permite
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)
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

- Mensagens: 27
- Registrado em: 21 Fev 2015 00:22
- Localização: Pimenta Bueno/RO
- Contato:
SETGET Como funciona em uma classe
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!
=================================================
Senhor, sem Ti, nada podemos fazer!
-
ivanil
- 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
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;
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

- Mensagens: 27
- Registrado em: 21 Fev 2015 00:22
- Localização: Pimenta Bueno/RO
- Contato:
SETGET Como funciona em uma classe
Na verdade a proposta do SETGET ou "settergetter" em todas as linguagens é ler e escrever dados encapsulados.JoséQuintas escreveu:Usa nRow como variável, mas ela faz mais que uma simples variável.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()
De repente, pra controles, oControl:BackColor := 127646
E o método BackColor trocaria a cor de fundo do controle.
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!
=================================================
Senhor, sem Ti, nada podemos fazer!