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: 3092
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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/
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