Página 1 de 1

Classes...

Enviado: 08 Jan 2013 00:16
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

Classes...

Enviado: 08 Jan 2013 18:07
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...

Classes...

Enviado: 09 Jan 2013 09:51
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.

Classes...

Enviado: 09 Jan 2013 17:30
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

Classes...

Enviado: 09 Jan 2013 17:53
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.

Classes...

Enviado: 10 Jan 2013 10:06
por Rogerio Amorim
Muito obrigado José...

Seus exemplos somaram a minha pesquisa...

Rogério