Página 1 de 1

OOP : Método não exportado

Enviado: 24 Jun 2016 20:55
por Vlademiro
Pessoal, já tentei de todo jeito e não consigo sair desse erro :

Tenho duas classes, uma herda da outra.

A classe pai (ou será mãe ?) é :

Código: Selecionar todos


/****c* TVladVar/Var
*
* NAME
*    TVladVar
*
* SOURCE
*/
CLASS TVladVar INHERIT TVladObject

   PROTECTED:
      DATA xVar INIT NIL



   EXPORT:

      METHOD New( xVar ) CONSTRUCTOR
      METHOD IsBlock()
      METHOD IsChar()
      METHOD IsDate()
      METHOD IsLogic()
      METHOD IsArray()
      METHOD IsMemo()
      METHOD IsNum()
      METHOD GetValue()  //  <=============================== Aqui está o método que quero usar na classe filha
      METHOD SetValue( xVar )



ENDCLASS
/******/

A classe filha é

Código: Selecionar todos


/****c* TVladArray/Array
*
* NAME
*    TVladArray
*
* SOURCE
*/
CLASS TVladArray INHERIT TVladVar

   PROTECTED:

      DATA aArray INIT {}

   EXPORT:

      METHOD New( xArray , cToken ) CONSTRUCTOR
      METHOD ToString( cDelimiter )
      METHOD AAdd( aArray )
      METHOD AClone()
      METHOD AScan( xSearch , nStart, nCount )


ENDCLASS
/******/

Tento usar nesse contexto abaixo :

Código: Selecionar todos

FUNCTION StringToArray( cString, cDelim )
LOCAL oArray := TVladArray():New( cString, cDelim )
LOCAL aArray

    aArray := oArray:GetValue()

RETURN aArray

E dá o seguinte erro :
Error BASE/1004 Mtodo n♠o exportado: GETVALUE
Called from GETVALUE(0)
Called from STRINGTOARRAY(178)

Onde foi que eu errei ?

OOP : Método não exportado

Enviado: 24 Jun 2016 22:59
por asimoes
CLASS TVladVar INHERIT TVladObject -> assim herda ( INHERIT) herança

CLASS TVladVar TVladObject -> assim é pai

OOP : Método não exportado

Enviado: 25 Jun 2016 10:23
por Vlademiro
Não conhecia essa notação, mas ainda não entendo porque o método GetValue não pode ser exportado.

Veja como está lá.

A classe TVladVar possui o método GetValue

A classe TVladArray herda de TVladVar

Não era para a classe TVladArray poder usar o método GetValue ?

OOP : Método não exportado

Enviado: 25 Jun 2016 14:01
por asimoes
Você tem declarar o método na classe filha

Não fiz o teste.

Código: Selecionar todos

/****c* TVladVar/Var
*
* NAME
*    TVladVar
*
* SOURCE
*/
CLASS TVladVar TVladObject //classe pai

   PROTECTED:
      DATA xVar INIT NIL



   EXPORT:

      METHOD New( xVar ) CONSTRUCTOR
      METHOD IsBlock()
      METHOD IsChar()
      METHOD IsDate()
      METHOD IsLogic()
      METHOD IsArray()
      METHOD IsMemo()
      METHOD IsNum()
      METHOD GetValue()  //  <=============================== Aqui está o método que quero usar na classe filha
      METHOD SetValue( xVar )

ENDCLASS

METHOD GetValue() CLASS TVladObject
RETURN Self


/******/

/****c* TVladArray/Array
*
* NAME
*    TVladArray
*
* SOURCE
*/
CLASS TVladArray INHERIT TVladVar //classe filha

   PROTECTED:

      DATA aArray INIT {}

   EXPORT:

      METHOD New( xArray , cToken ) CONSTRUCTOR
      METHOD ToString( cDelimiter )
      METHOD AAdd( aArray )
      METHOD AClone()
      METHOD AScan( xSearch , nStart, nCount )
      METHOD GetValue() 


ENDCLASS
/******/

METHOD GetValue() CLASS TVladVar 
RETURN Self


OOP : Método não exportado

Enviado: 25 Jun 2016 14:29
por asimoes
Um exemplo simples:

Código: Selecionar todos


FUNCTION MAIN()

   oPai  :=ClPai():New()
   oFilha:=ClFilha():New()
   
   oPai:Teste("PAI")
   oFilha:Teste("FILHA", "DO PAI")
              
  
RETURN Nil

CREATE CLASS ClPai

   EXPORTED :
   
   METHOD Teste( cString1 )
   
   END CLASS

METHOD Teste( cString1 ) CLASS ClPai
   Alert(cString1)
   RETURN Self

CREATE CLASS ClFilha INHERIT ClPai

   EXPORTED :

   METHOD Teste(cString1, cString2)
   
   END CLASS
   
METHOD Teste(cString1, cString2) CLASS ClFilha
   Alert(cString1 +" "+ cString2)
   RETURN Self


OOP : Método não exportado

Enviado: 25 Jun 2016 15:07
por Vlademiro
Amigo, obrigado por me ajudar !

Olha, acho que não é assim não.

Sabe porque ?

Porque o que eu quero é não ter que definir de novo o método teste na classe filha. Eu quero herdar o método do pai.

Eu comentei o método teste na classe filha no seu exemplo conforme abaixo e deu certo :

Código: Selecionar todos


#include "hbclass.ch"

FUNCTION MAIN()

   oPai  :=ClPai():New()
   oFilha:=ClFilha():New()

   oPai:Teste("PAI")
   oFilha:Teste("FILHA", "DO PAI")


RETURN Nil

CREATE CLASS ClPai

   EXPORTED :

   METHOD Teste( cString1 )

   END CLASS

METHOD Teste( cString1 ) CLASS ClPai
   Alert(cString1)
   RETURN Self

CREATE CLASS ClFilha INHERIT ClPai

   EXPORTED :

   //METHOD Teste(cString1, cString2)

   END CLASS
   /*
METHOD Teste(cString1, cString2) CLASS ClFilha
   Alert(cString1 +" "+ cString2)
   RETURN Self
*/


Como resultado o programinha exibe um alert com o nome 'PAI' e outro alert com o nome 'FILHA' , mas o método usado foi definido na classe pai.

Eu tenho certeza que o problema é no meu código em outro local. Vou procurar aqui. Deve ser alguma burrada minha que tá dando esse erro.

Agora tem um detalhe que me ocorreu agora.

A minha classe pai chama-se TVladVar

e tenho várias classes filhas, como TVladDate, TVladString, TVladArray (a que está dando problema), TVladNumeric, etc. Uma para cada tipo de dado. A classe TVladDate funciona, mas não testei as outras ainda. Vou fazer isso e se descobrir algo eu posto aqui.

Estou torcendo para o problema ser eu mesmo. :xau

OOP : Método não exportado

Enviado: 25 Jun 2016 15:30
por asimoes
Que bom que você resolveu.

O meu exemplo, como eu bem disse "um exemplo" nem sei o que você pretende fazer.
Era demonstrar que um método pode ser herdado de uma classe e seus parâmetros podem ser acrescentados ou não.

OOP : Método não exportado

Enviado: 25 Jun 2016 16:26
por Vlademiro
asimoes, encontrei a burrada!

Vou reproduzir o meu erro no seu código de exemplo

Código: Selecionar todos


#include "hbclass.ch"

FUNCTION MAIN()

   oPai  :=ClPai():New()
   oFilha:=ClFilha():New()

   oPai:Teste("PAI")
   oFilha:Teste("FILHA", "DO PAI")


RETURN Nil

CREATE CLASS ClPai

   EXPORTED :
   METHOD Teste( cString1 )

   END CLASS

METHOD Teste( cString1 ) CLASS ClPai
   Alert(cString1)
   RETURN Self

CREATE CLASS ClFilha INHERIT ClPai

   EXPORTED :
   METHOD NEW() CONSTRUCTOR
   //METHOD Teste(cString1, cString2)

   END CLASS

METHOD New() CLASS ClFilha

RETURN "Tem que retornar Self"
//RETURN Self


   /*
METHOD Teste(cString1, cString2) CLASS ClFilha
   Alert(cString1 +" "+ cString2)
   RETURN Self
*/

Gera o erro

Error BASE/1004 No exported method: TESTE
Called from TESTE(0)
Called from MAIN(9)


O meu construtor da classe filha estava retornando um valor diferente de Self.
Devo ter copiado de um outro trecho.

Obrigado pela atenção!