Classes...

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

Moderador: Moderadores

Rogerio Amorim
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 23 Jul 2011 17:08
Localização: Campinas/SP

Classes...

Mensagem por Rogerio Amorim »

Saudações a todos...

Estou testando o uso de classes no xharbour e estou com uma dúvida.

Criei a seguinte classe no fonte classTabelas.prg

Código: Selecionar todos

# include "hbclass.ch"
CREATE CLASS TTabelas
	PROTECTED :
	 	METHOD AbreTabelas() VIRTUAL //-> metodo que abre as tabelas da classe
	 	METHOD FechaTabelas() VIRTUAL //-> m‚todo que fecha as tabelas abertas na classe
	EXPORTED :
ENDCLASS
Depois criei a classe TProduto no fonte classProduto.prg herdando da classe TTabelas

Código: Selecionar todos

CREATE CLASS TProduto FROM TTabelas
	PROTECTED :
	 	DATA nCodProduto 
	 	DATA cNomeProduto
	EXPORTED :
ENDCLASS
Como podem ver são duas classes em fontes distintos. Mas ao implementar o método AbreTabelas() e FechaTabelas() da classe pai TTabelas na classe filha TProduto, está dando erro dizendo que os métodos não foram declarados na classe TProduto.

Gostaria de saber como eu reescrevo o método herdado da classe pai na classe filha sem precisar colocar todas as classes no mesmo fonte ?

Tentei colocar na classe TProduto(filha) um #include "classTabelas.prg" mas não funciona.

Agradeço a ajuda.
Rogério
Editado pela última vez por anacatacombs em 08 Jan 2013 17:51, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
alxsts
Colaborador
Colaborador
Mensagens: 3110
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Classes...

Mensagem por alxsts »

Olá!

Fiz alguns testes para "brincar". Espero que te dê alguma ideia. Ficou assim:

classTabelas.prg

Código: Selecionar todos

//--------------------------------------------------------------
#include "hbclass.ch"

CLASS TTabelas
   PROTECTED :
      METHOD AbreTabelas() VIRTUAL //-> método que abre as tabelas da classe
      METHOD FechaTabelas() VIRTUAL //-> método que fecha as tabelas abertas na classe
   EXPORTED :
ENDCLASS

//--------------------------------------------------------------
//Depois criei a classe TProduto no fonte classProduto.prg herdando da classe TTabelas

CLASS TProduto FROM TTabelas
   PROTECTED :
      DATA nCodProduto
      DATA cNomeProduto
   EXPORTED :
      VAR _nCodProduto  INIT 1000
      VAR _cNomeProduto INIT 'REBIMBOCA DA PARAFUSETA'

ENDCLASS
//--------------------------------------------------------------
classProduto.prg

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main()

   LOCAL oProd

   OVERRIDE METHOD AbreTabelas  IN CLASS TTabelas WITH _AbreTabelas
   OVERRIDE METHOD FechaTabelas IN CLASS TTabelas WITH _FechaTabelas

   AltD()

   oProd := TProduto():New()

   ? oProd:AbreTabelas()
   ? oProd:_nCodProduto
   ? oProd:_cNomeProduto
   ? oProd:FechaTabelas()

   inkey(0)

   RETURN
//--------------------------------------------------------------
STATIC FUNCTION _AbreTabelas()
   //LOCAl Self := HB_QSelf()

   RETURN "Tabelas Abertas..."
//--------------------------------------------------------------
STATIC FUNCTION _FechaTabelas()
   //LOCAl Self := HB_QSelf()

   RETURN "Tabelas Fechadas..."
//--------------------------------------------------------------
Bem básico mas, funcionou...
[]´s
Alexandre Santos (AlxSts)
Rogerio Amorim
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 23 Jul 2011 17:08
Localização: Campinas/SP

Classes...

Mensagem por Rogerio Amorim »

Valeu Alexandre...

Obrigado pela dica..., Entrei de cabeça no assunto Classes em xHarbour e estou "tateando" meio que no escuro... sua ajuda foi preciosa.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20419
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Classes...

Mensagem por JoséQuintas »

Aproveitando... comecei a ajustar para o que falaram: que vão acabar eliminando o método New() para o usuário mexer.
Uso do jeito mais tradicional (eu acho).

Tenho lá a classe principal.
E na classe que herda essa, declaro os métodos a serem modificados.
É necessário declarar no início da classe, além de colocar o método.
Mas é Harbour, não sei se no xHarbour seria igual.

Código: Selecionar todos


// programa---------------------------

PROCEDURE CadCli
   LOCAL oFrm := ClientesClass():New()
   oFrm:Execute()
   RETURN

// classe que herda e modifica abrearquivos()--------

CREATE CLASS ClientesClass INHERIT CadastroClass
   METHOD AbreArquivos()
  ENDCLASS

METHOD AbreArquivos() CLASS ClientesClass
   USE CLIENTES
   RETURN NIL

// classe original-------------------

CREATE CLASS CadastroClass
   METHOD AbreArquivos()
   METHOD Execute()
   ENDCLASS

METHOD AbreArquivos() CLASS CadastroClass
   RETURN NIL

METHOD Execute() CLASS CadastroClass
   ::AbreArquivos()
   Browse()
   CLOSE DATABASES
   RETURN NIL
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20419
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Classes...

Mensagem por JoséQuintas »

Ou ainda, aproveitando o Init() que é chamado em New()

Código: Selecionar todos

// programa---------------------------

PROCEDURE CadCli
   LOCAL oFrm := ClientesClass():New()
   oFrm:Execute()
   RETURN

// classe que herda com Init() próprio--------

CREATE CLASS ClientesClass INHERIT CadastroClass
   METHOD Init()
  ENDCLASS

METHOD Init() CLASS ClientesClass
   USE CLIENTES
   RETURN NIL

// classe original-------------------

CREATE CLASS CadastroClass
   METHOD Execute()
   ENDCLASS

METHOD Execute() CLASS CadastroClass
   Browse()
   CLOSE DATABASES
   RETURN NIL
Mas é só exemplo.
Nesse exemplo, se abrir os arquivos no módulo, nem precisa modificar a classe principal.
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/
Rogerio Amorim
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 23 Jul 2011 17:08
Localização: Campinas/SP

Classes...

Mensagem por Rogerio Amorim »

Muito obrigado José...

Seus exemplos somaram a minha pesquisa...

Rogério
Responder