Como é a orientação a objeto no Harbour
Moderador: Moderadores
-
Jorge Luiz
- 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
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
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

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

- Mensagens: 36
- Registrado em: 08 Jul 2024 20:23
- Localização: Piauí
- JoséQuintas
- 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
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.
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/
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

- Mensagens: 36
- Registrado em: 08 Jul 2024 20:23
- Localização: Piauí
Re: Como é a orientação a objeto no Harbour
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
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

- Mensagens: 36
- Registrado em: 08 Jul 2024 20:23
- Localização: Piauí
Re: Como é a orientação a objeto no Harbour
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.
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
Aprenda programação e robótica totalmente grátis!
Participe das discussões, tire dúvidas e compartilhe conhecimento.
Prepare-se para o vestibular com apoio gratuito e solidário.
Reflexões sobre o tempo, física e filosofia.
Como o estudo intenso de programação me levou ao limite — e o que aprendi com isso.
-
Jorge Luiz
- Usuário Nível 1

- Mensagens: 36
- Registrado em: 08 Jul 2024 20:23
- Localização: Piauí
-
Jorge Luiz
- 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
JoséQuintas
Você entendeu o que quero fazer?
Deixa pra lá!
Estou vendo que não existe Orientação a Objeto no Clipper / Harbour
Você entendeu o que quero fazer?
Deixa pra lá!
Estou vendo que não existe Orientação a Objeto no Clipper / Harbour
-
alxsts
- 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
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:
Tutorial OOP Harbour Classes
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:
Segue um texto gerado por IA, contendo Conceitos básicos:Jorge Luiz escreveu: 26 Jul 2026 15:48 Deixa pra lá!
Estou vendo que não existe Orientação a Objeto no Clipper / Harbour
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).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:
2. Desenvolvendo os MétodosCó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
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.
3. Instanciando e Usando o ObjetoCó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
Para criar e utilizar o objeto no seu programa principal, usamos o operador : (dois pontos).
4. Encapsulamento (Controle de Acesso)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
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.
5. Herança (Reutilização de Código)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
A herança permite que uma classe filha herde todas as características e métodos de uma classe pai (FROM).
6. Métodos Inline (Atalhos rápidos)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
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:
8. Exemplo Prático: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
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.
9. Usando a Classe de Banco de Dados no Programa Principal: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
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
Tutorial OOP Harbour Classes
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)