Como é a orientação a objeto no Harbour

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

Moderador: Moderadores

Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Como é a orientação a objeto no Harbour
O arquivo que quero inserir a orientação a objeto está logo abaixo

https://iatagancursos.github.io/Megusta ... do/prg.zip
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Queria que meu código Harbour fosse Orientado a Objeto
Tem como?
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Olá?
Alguém pra ajudar?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20524
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 2 vezes

Re: Como é a orientação a objeto no Harbour

Mensagem por JoséQuintas »

Acho que não é assim que funciona, não é mudar qualquer fonte pra objeto.
OS FONTES atuais já estão confusos, parece duplicação, e com análises não necessárias, pra não dizer coisa errada.
O endereço sugere se tratar de alguém criando apostilas pra ensinar alguma coisa, o que não é incentivador.
A princípio vai precisar de muito tempo, sem vantagem aparente.
Acho que exageraram no suposto exemplo, o que deixa na dúvida a finalidade.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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/
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Estou criando o Megusta
União das linguagens de programação Java, Javascript, Typescript, Node.js, PHP, Python, Clipper, Rust, C/C++, ASSEMBLY e WebAssembly.
Veja o código no Github
https://iatagancursos.github.io/Megusta ... cipal.html
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Apoie meu trabalho Open Source 💻🚀
https://github.com/sponsors/iataganCursos 🌐❤️
Ajude a manter projetos abertos e cursos gratuitos! 📚✨
Seu apoio fortalece o ecossistema Open Source 🤝
Contribua para o desenvolvimento contínuo 🔧📈
Incentive a produção de conteúdo educacional livre 🎓📖
Apoie iniciativas que democratizam o conhecimento 🌍💡
Faça parte dessa missão colaborativa 👥🚀
Cada contribuição conta para o futuro 🔮💪
Obrigado por apoiar projetos abertos e educação gratuita 🙏💙
🚀 Curso Gratuito de Programação, Eletrônica e Robótica
🎓 https://ouka.com.br/
Aprenda programação e robótica totalmente grátis! 🤖💡
💬 Entre no grupo do Telegram
🔗 https://t.me/+nge23AaS2jFkOGMx
Participe das discussões, tire dúvidas e compartilhe conhecimento. 🤝💬
🎯 Cursinho Pré-vestibular Comunitário
📘 https://iatagan.com.br/
Prepare-se para o vestibular com apoio gratuito e solidário. 💪📚
⏳ Sabia que o tempo não é retilíneo e sim aleatório?
🌀 https://teoriadotempo.blogspot.com/
Reflexões sobre o tempo, física e filosofia. 🧠✨
😵‍💫 Minha experiência com Burnout e Computação
💻 https://jorgeia.blogspot.com/
Como o estudo intenso de programação me levou ao limite — e o que aprendi com isso. 💔🔥
🚨 Livro publicado na Uiclap
📚 https://loja.uiclap.com/titulo/ua56735/
💸 De R$61,38 por R$48,59!
📷 Explore ideias sobre tecnologia, filosofia e sociedade.
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

Queria fazer ele Orientado a Objeto
Jorge Luiz
Usuário Nível 1
Usuário Nível 1
Mensagens: 36
Registrado em: 08 Jul 2024 20:23
Localização: Piauí

Re: Como é a orientação a objeto no Harbour

Mensagem por Jorge Luiz »

JoséQuintas
Você entendeu o que quero fazer?

Deixa pra lá!
Estou vendo que não existe Orientação a Objeto no Clipper / Harbour
alxsts
Colaborador
Colaborador
Mensagens: 3169
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil
Curtiram: 5 vezes

Re: Como é a orientação a objeto no Harbour

Mensagem por alxsts »

Olá!

Creio que a melhor resposta para a questão do título do tópico é: pesquise, estude, teste.

Se tivesse feito isto, não teria escrito:
Jorge Luiz escreveu: 26 Jul 2026 15:48 Deixa pra lá!
Estou vendo que não existe Orientação a Objeto no Clipper / Harbour
Segue um texto gerado por IA, contendo Conceitos básicos:
A programação orientada a objetos (POO) no Harbour é feita usando comandos próprios como CLASS e ENDCLASS para criar moldes, definir dados e criar funções que pertencem aos objetos.

A biblioteca nativa que gerencia a POO no Harbour é a HBClass. Ela permite criar sistemas modulares, reutilizáveis e fáceis de manter.

1. Estrutura Básica de uma Classe

Para definir uma classe, usamos os comandos CLASS e ENDCLASS. Dentro dela, definimos as características (DATA) e os comportamentos (METHOD).

Exemplo de Sintaxe:

Código: Selecionar todos

#include "hbclass.ch"

CLASS Cliente
   // Atributos (Variáveis da classe)
   DATA ID          INIT 0
   DATA Nome        INIT ""
   DATA Saldo       INIT 0.00

   // Métodos (Funções da classe)
   METHOD New( nId, cNome ) CONSTRUCTOR
   METHOD Depositar( nValor )
   METHOD VerSaldo()
ENDCLASS
2. Desenvolvendo os Métodos

Os métodos declarados dentro da classe precisam ser desenvolvidos fora dela. Usamos a sintaxe METHOD NomeDoMetodo() CLASS NomeDaClasse.

💡 Nota Importante:
Dentro do método, usamos a palavra-chave :: (que significa self:) para acessar as variáveis e métodos do próprio objeto.

Código: Selecionar todos

// Método Construtor (Instancia o objeto)
METHOD New( nId, cNome ) CLASS Cliente
   ::ID   := nId
   ::Nome := cNome
return Self

// Método para alterar o saldo
METHOD Depositar( nValor ) CLASS Cliente
   if nValor > 0
      ::Saldo += nValor
   endif
return NIL

// Método para exibir informações
METHOD VerSaldo() CLASS Cliente
   ? "Cliente:", ::Nome
   ? "Saldo Atual: R$", Transform( ::Saldo, "@E 999,999.99" )
return NIL
3. Instanciando e Usando o Objeto

Para criar e utilizar o objeto no seu programa principal, usamos o operador : (dois pontos).

Código: Selecionar todos

PROCEDURE Main()
   LOCAL oCliente

   // Criando uma nova instância da classe Cliente
   oCliente := Cliente():New( 101, "Carlos Andrade" )

   // Executando os métodos
   oCliente:Depositar( 1500.50 )
   oCliente:VerSaldo()

   // Acessando um dado diretamente (se for público)
   ? "ID do Cliente consultado diretamente:", oCliente:ID
return
4. Encapsulamento (Controle de Acesso)

Por padrão, as variáveis DATA são públicas. Para proteger seus dados contra modificações diretas e indevidas, use as diretivas de visibilidade:
EXPORTED: (Padrão) Acessível por qualquer parte do programa.
PROTECTED: Acessível apenas pela própria classe e por suas subclasses (herança).
HIDDEN: Acessível estritamente apenas pela própria classe onde foi criada.

Código: Selecionar todos

CLASS ContaBancaria
   PROTECTED:
      DATA NumeroConta
      DATA Saldo INIT 0

   EXPORTED:
      METHOD New( cNumero ) CONSTRUCTOR
      METHOD ObterSaldo()
ENDCLASS

METHOD New( cNumero ) CLASS ContaBancaria
   ::NumeroConta := cNumero
return Self

METHOD ObterSaldo() CLASS ContaBancaria
   return ::Saldo // Programa externo 
5. Herança (Reutilização de Código)

A herança permite que uma classe filha herde todas as características e métodos de uma classe pai (FROM).

Código: Selecionar todos

// Classe Pai
CLASS Pessoa
   DATA Nome INIT ""
   DATA Email INIT ""
ENDCLASS

// Classe Filha que herda de Pessoa
CLASS PessoaFisica FROM Pessoa
   DATA CPF INIT ""
ENDCLASS

PROCEDURE TesteHeranca()
   LOCAL oPF := PessoaFisica():New()

   // Atributos herdados da classe Pessoa
   oPF:Nome  := "Maria Souza"
   oPF:Email := "maria@email.com"
   
   // Atributo exclusivo da classe PessoaFisica
   oPF:CPF   := "123.456.789-00"
return
6. Métodos Inline (Atalhos rápidos)

Se o seu método executa apenas uma linha de comando simples, você não precisa desenvolvê-lo fora da classe. Pode criá-lo diretamente como INLINE.

Código: Selecionar todos

CLASS Calculadora
   // Método inline sem necessidade de bloco externo
   METHOD Somar( a, b ) INLINE ( a + b )
   METHOD Subtrair( a, b ) INLINE ( a - b )
ENDCLASS

7. Polimorfismo (Sobrescrita de Métodos)

O polimorfismo acontece quando uma classe filha herda um método da classe pai, mas altera o comportamento dele para se adequar à sua própria realidade. No Harbour, basta redefinir o METHOD na classe filha com o mesmo nome e criar a nova lógica.

Exemplo Prático:

Sistema de Folha de Pagamento

Código: Selecionar todos

#include "hbclass.ch"

// -----------------------------------------------------------
// CLASSE PAI: Funcionario
// -----------------------------------------------------------
CLASS Funcionario
   DATA Nome         INIT ""
   DATA SaldoBase    INIT 0.00

   METHOD New( cNome, nSal ) CONSTRUCTOR
   METHOD CalcularSalario()
ENDCLASS

METHOD New( cNome, nSal ) CLASS Funcionario
   ::Nome      := cNome
   ::SaldoBase := nSal
return Self

METHOD CalcularSalario() CLASS Funcionario
return ::SaldoBase


// -----------------------------------------------------------
// CLASSE FILHA 1: Gerente (Ganha o salário base + bônus de 20%)
// -----------------------------------------------------------
CLASS Gerente FROM Funcionario
   // Sobrescreve o método do Pai para aplicar o bônus
   METHOD CalcularSalario() 
ENDCLASS

METHOD CalcularSalario() CLASS Gerente
return ::SaldoBase * 1.20


// -----------------------------------------------------------
// CLASSE FILHA 2: Vendedor (Ganha salário base + comissão fixa)
// -----------------------------------------------------------
CLASS Vendedor FROM Funcionario
   DATA Comissao     INIT 500.00

   // Sobrescreve o método do Pai para somar a comissão
   METHOD CalcularSalario() 
ENDCLASS

METHOD CalcularSalario() CLASS Vendedor
return ::SaldoBase + ::Comissao

Executando o Polimorfismo:

Código: Selecionar todos

PROCEDURE Main()
   LOCAL oFunc1, oFunc2

   oFunc1 := Gerente():New( "Alice Souza", 5000.00 )
   oFunc2 := Vendedor():New( "Bruno Lima", 2000.00 )

   // O mesmo método "CalcularSalario()" age de formas diferentes (Polimorfismo)
   ? "Salario da Gerente " + oFunc1:Nome + ": R$", oFunc1:CalcularSalario() // Retorna 6000.00
   ? "Salario do Vendedor " + oFunc2:Nome + ": R$", oFunc2:CalcularSalario() // Retorna 2500.00
return
8. Exemplo Prático:

POO integrada com DBF (Banco de Dados)

Mapear tabelas de banco de dados (neste caso, arquivos .DBF) para objetos é um padrão de projeto muito eficiente conhecido como Data Mapper ou Active Record.

A classe abaixo gerencia a tabela PRODUTOS.DBF. Ela é responsável por abrir o arquivo, carregar os dados para a memória dentro do objeto, salvar alterações e fechar o arquivo de forma limpa.

Código: Selecionar todos

#include "hbclass.ch"

// -----------------------------------------------------------
// CLASSE: ProdutoDBF
// -----------------------------------------------------------
CLASS ProdutoDBF
   // Atributos que espelham os campos do DBF
   DATA Codigo       INIT 0
   DATA Descricao    INIT ""
   DATA Preco        INIT 0.00
   
   // Controle interno do arquivo
   PROTECTED:
      DATA AreaTrabalho INIT 0

   EXPORTED:
      METHOD New() CONSTRUCTOR
      METHOD Localizar( nCodigo )
      METHOD Salvar()
      METHOD Fechar()
ENDCLASS

// Construtor: Abre o banco de dados e guarda a área de trabalho
METHOD New() CLASS ProdutoDBF
   // Se o DBF não existir, cria a estrutura básica
   if !File( "PRODUTOS.DBF" )
      DbCreate( "PRODUTOS.DBF", { ;
         { "CODIGO"   , "N",  6, 0 }, ;
         { "DESCRICAO", "C", 40, 0 }, ;
         { "PRECO"    , "N", 10, 2 }  ;
      } )
   endif

   // Abre o arquivo de forma compartilhada
   USE PRODUTOS SHARED NEW
   ::AreaTrabalho := Select() // Guarda o ponteiro desta tabela
return Self

// Busca um produto pelo código e carrega para as variáveis do objeto
METHOD Localizar( nCodigo ) CLASS ProdutoDBF
   LOCAL lAchou := .F.

   Select( ::AreaTrabalho )
   LOCATE FOR field->CODIGO == nCodigo

   if Found()
      ::Codigo    := field->CODIGO
      ::Descricao := field->DESCRICAO
      ::Preco     := field->PRECO
      lAchou      := .T.
   else
      ::Codigo    := nCodigo
      ::Descricao := "PRODUTO NAO ENCONTRADO"
      ::Preco     := 0.00
   endif
return lAchou

// Salva os dados atuais do objeto de volta no arquivo DBF
METHOD Salvar() CLASS ProdutoDBF
   Select( ::AreaTrabalho )
   
   // Tenta localizar para atualizar, se não achar, cria um registro novo
   LOCATE FOR field->CODIGO == ::Codigo
   if !Found()
      APPEND BLANK
   endif

   // Bloqueia o registro para gravação segura (padrão de rede)
   if RLock()
      field->CODIGO    := ::Codigo
      field->DESCRICAO := ::Descricao
      field->PRECO     := ::Preco
      DbUnlock()
      ? "Dados gravados com sucesso no DBF!"
   else
      ? "Erro: Registro travado por outro usuario."
   endif
return NIL

// Fecha o arquivo DBF de forma segura ao encerrar o objeto
METHOD Fechar() CLASS ProdutoDBF
   Select( ::AreaTrabalho )
   USE
return NIL
9. Usando a Classe de Banco de Dados no Programa Principal:

Código: Selecionar todos

PROCEDURE Main()
   LOCAL oProd

   // 1. Inicializa o objeto (abre o banco de dados por baixo dos panos)
   oProd := ProdutoDBF():New()

   // 2. Criando e salvando um novo produto
   oProd:Codigo    := 10
   oProd:Descricao := "Teclado Mecanico RGB"
   oProd:Preco     := 249.90
   oProd:Salvar()

   // 3. Modificando os dados em memória e salvando a alteração
   oProd:Preco     := 229.00 // Aplicando um desconto
   oProd:Salvar()

   // 4. Consultando outro produto para testar a busca
   ? "--- Testando Busca ---"
   if oProd:Localizar( 10 )
      ? "Codigo encontrado:", oProd:Codigo
      ? "Nome do Produto:  ", oProd:Descricao
      ? "Preco de Venda:   R$", oProd:Preco
   endif

   // 5. Fecha os arquivos de dados abertos pelo objeto
   oProd:Fechar()
return
Nota: nas versões do Clipper acima de 5.0, a OOP poderia ser aplicada, basicamente com a mesma sintaxe acima, utilizando-se a biblioteca Class(y).

Tutorial OOP Harbour Classes
[]´s
Alexandre Santos (AlxSts)
Responder