Página 1 de 1

Orientação a Objetos em Harbour

Enviado: 13 Fev 2011 08:59
por =NuNuNO= Griesbach
Olá a todos da lista, já desenvolvi em clipper a uns bons 15 anos atrás, após isto migrei para o Visual Foxpro e tenho uma serie de sistemas que precisarei migrar, agora que a Microsoft resolveu descontinuar a linguagem e a compatibilidade com o Windows.
Como qualquer programador eu não gosto da perspectiva de refazer o que já fiz, mas, já que vou precisar (re)fazer de qualquer jeito, pretendo fazer as coisas do jeito certo.
Estou começando a descobrir o harbour agora, e bastante animado com a possibilidade de poder criar minhas próprias classes com o hbclass.ch e utilizar bibliotecas gráficas multiplataforma como hbQt. Tenho feito diversos testes antes de começar qualquer coisa, e estou precisando de uma ajudinha no que se refere a sintaxe e as possibilidades das classes que posso criar com o hbclass.ch:

1) Como criar propriedades estáticas? Por exemplo, digamos que eu tenha uma classe que herda da QDialog, e quero adicionar um contador estático para saber quantos dialogos eu tenho abertos, como é a sintaxe para declarar um contador destes dentro da classe?

2) Propriedades protected e private. Em meus testes, a sintaxe
CLASS minhaClasse
PRIVATE:
DATA minhaPropriedadePrivada
ENDCLASS
não compilou, porém, é a mesma sintaxe que encontrei em diversos exemplos aqui do fórum e em outros locais, estou fazendo alguma coisa errada?

3)Existe alguma coisa semelhante ao instanceOf do php5 em harbour? Em algumas ocasiões, principalmente para melhor debugar é interessante saber que tipo de instancia está sendo usada, porém até o momento, estou colocando um método getClassName() em cada classe que faço. Existe um meio melhor?

4) Herança multipla / Interfaces - O harbour possui suporte a herança multipla? Na pratica não devo utilizar muito este recurso, mas, em alguns casos evita bastante cópia de bloco. E como o C++ permite, e o harbour gera código C antes de fazer o executável, achei conveniente levantar a dúvida...

5) Antigamente, eu escrevia um códigozinho mandraque em C, e linkava o obj no meu executável. Sei que isto também é possível em harbour provavelmente até melhor do que no saudoso clipper, eu posso criar classes diretamente em C++ e de alguma maneira simples utilizá-las em meus PRGs? Ou isto funciona apenas para funções?

6) Já existe alguma coisa pronta em harbour para facilitar o uso de patterns como o MVC ou então a abstração da base dados (algo semelhante ao hibernate do java)?

É isto ai, desculpe o texto longo e muito obrigado a todos que puderem dispensar algum tempo nisto.

Um grande abraço

=NuNuNO==
( Que teve medo de criar um tópico para cada pergunta, então colocou tudo num lugar só)

Re: Orientação a Objetos em Harbour

Enviado: 15 Fev 2011 09:59
por =NuNuNO= Griesbach
Olá novamente,

É com grande prazer que anuncio que a simples leitura da hbclass e algumas horinhas de tentativa e erro já me deram algumas das respostas, que irei postar para talvez ajudar alguém que também esteja começando, e pra matar a curiosidade alguém que por ventura também se interesse por OO.

1) Propriedades estáticas: Não é muito bonito, mas me atendeu perfeitamente. A variável é declarada estática no escopo do método, então ela nunca perde seu valor e todas as instâncias da mesma classe podem acessa-la.

Código: Selecionar todos

METHOD _staticContador(action, value) CLASS estatico 
   STATIC contador := 0
   if(action == 'set')
      contador := value
   endif
RETURN contador
2) Escopo dentro da classe: Minha confusão foi com os termos, não existe PRIVATE em [x]harbour, e sim HIDDEN. Descobri que posso declarar métodos e variaveis com os seguintes alteradores de escopo:
HIDDEN : Visíveis apenas para a classe que os declara, e não para classes filhas
PROTECTED: Visíveis para a classe que os declara e também para as classes filhas
EXPORTED: Visivel para todo mundo que pode acessar a classe

3) Funções de casting em tempo de execução: Todas as classes herdam automaticamente de HBOBJECT, que por sua vez implementa os métodos className() e isKindOf que permitem em tempo de execução saber quem são as instâncias.

4) Herança multipla: Sim, basta na clausula INHERIT separar o nome das classes por virgula.

5) Usar classes C++ dentro do PRG: Ainda não tentei, mas, se o QT faz, tem jeito.

6) Abstração de base de dados, e modelos para MVC. Não achei nada do genero já existente, estou implementando meu "hibernate de pobre" e meu "MVC de pobre" para entre outras coisas me ambientar com a sintaxe. Se algum deles ficar/parecer útil posso disponibiliza-lo sem problemas.

Um grande abraço

=NuNuNO==
( Que não teria abandonado o Clipper se ele tivesse estes recursos a 15 anos atrás... )

Re: Orientação a Objetos em Harbour

Enviado: 15 Fev 2011 14:34
por alxsts
Olá!

Quanto ao item 5 acima, pode-se incluir no código fonte [x]Harbour código fonte escrito em C++. Basta inclur entre as diretivas

Código: Selecionar todos

#pragma BEGINDUMP
// código fonte escrito em C
#pragma ENDDUMP
Para ler um tópico básico e didático que ilustra o uso de OOP em [x]Harbour, clique aqui.

Re: Orientação a Objetos em Harbour

Enviado: 15 Fev 2011 14:54
por Maligno
C e/ou C++? Tem uma grande diferença entre as duas.

Re: Orientação a Objetos em Harbour

Enviado: 15 Fev 2011 21:57
por =NuNuNO= Griesbach
Fiz alguns testes rápidos, e o C ansi compila numa boa, o C++ infelizmente não... Ele parece nem reconhecer a declaração class...

Código: Selecionar todos

FUNCTION testeCpp()

   RETURN testCpp()
   
   #pragma BEGINDUMP
   
   #include "hbapi.h"
   #include <stdio.h>
   HB_FUNC( TESTCPP )
   {  
      printf("eu sou um printf ");
   }
    #pragma ENDDUMP

porem tentando com o cout << "eu sou o cout" << endl; ele não compilou, não encontrou a iostream...
Talvez isto seja contornável, amanhã vou tentar com um pouco mais de persuasão (definindo path de include e talvez alguma lib padrão do mingw)...

Um grande abraço

=NuNuNO==
( Que está muito agradecido pelo tópico básico e didatico e o lerá com carinho )

Orientação a Objetos em Harbour

Enviado: 29 Out 2011 18:32
por mhackervix
=NuNuNO= Griesbach escreveu:6) Já existe alguma coisa pronta em harbour para facilitar o uso de patterns como o MVC ou então a abstração da base dados (algo semelhante ao hibernate do java)?
No Xailer (IDE para [x]Habour) tem as Classes TDataSource, TDataSet, TField, etc... que implementam uma abstração de base de dados no [x]Habour.

att.