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.prgCó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