Página 1 de 1

Harbour

Enviado: 14 Abr 2019 15:20
por LABREGO
Alguém poderia me ajudar no problema que estou encontrando?

Estou desenvolvendo um sistema orientado a objeto e deparei-me com o problema descrito abaixo.

Quando herdo a classe PopUp em uma classe qualquer ocorre o erro em tempo de execução:

Error BASE/3002 Super class 'POPUP' does not return an object: __CLSINSTSUPER

Eis um exemplo do código:

/*******************************/
CLASS TPopUp FROM PopUp
/******************************/

HIDDEN:
DATA oPopUp, oColors AS Object
EXPORT:
METHOD New, AddPopUp, AddPrompt, AddSeparator, Modal

ENDCLASS

Harbour

Enviado: 14 Abr 2019 16:03
por JoséQuintas
À primeira vista, o que tem nessa classe destruiu a classe herdada.

Harbour

Enviado: 14 Abr 2019 17:09
por asimoes
Se vai herdar tem que usar INHERIT

Então se essa classe PopUp existe:

CLASS TPopUp INHERIT PopUp

Harbour

Enviado: 14 Abr 2019 21:04
por alxsts
Olá!

Seja bem-vindo ao Fórum Labrego!
asimoes escreveu:Se vai herdar tem que usar INHERIT
FROM e INHERIT, em [x]Harbour, são sinônimos. Sendo assim, tanto faz.

Seu exemplo de código é pequeno não sendo possível uma análise mais ampla. Obrservando a mensagem de erro, observa-se que o método construtor da classe PopUp não está retornando um objeto, como deveria fazer. Algo assim:

Código: Selecionar todos

/*******************************/
CLASS PopUp 
/******************************/
   //
   // Declarações
   //
EndClass
//----------------------------------------------------------------------
Method New() Class PopUp
   // 
   // Procedimentos
   //
Return self  // --> self é um objeto e representa a própria classe
//----------------------------------------------------------------------
/*******************************/
CLASS TPopUp FROM PopUp
/******************************/
   HIDDEN:
   DATA oPopUp, oColors AS Object

   EXPORT:
   // METHOD New, AddPopUp, AddPrompt, AddSeparator, Modal
   METHOD New 
   METHOD AddPopUp
   METHOD AddPrompt
   METHOD AddSeparator
   METHOD Modal
ENDCLASS
//----------------------------------------------------------------------
Method New() Class TPopUp
   // 
   // Procedimentos
   //
Return self  // --> self é um objeto e representa a própria classe
//----------------------------------------------------------------------
É este tipo de construção de código (método retornando a própria classe) que possibilita escrevermos código como:

Código: Selecionar todos

oTBrowse:goTop():refreshAll()
Neste caso, o método goTop() retorna self o próprio objeto TBrowse(), que tem em seguida invocado o seu método refreshAll().

Para facilitar a análise de código fonte, o Fórum tem a "tag code" presente na barra de ferramentas da página que se abre para postar mensagens. Basta clicar no botão mostrado abaixo e colar o código entre as tags.
BotãoCode.JPG
Para outras informações sobre formatação de mensagens, veja: Guia do BBCode

Harbour

Enviado: 14 Abr 2019 22:13
por JoséQuintas
alxsts escreveu:Seu exemplo de código é pequeno não sendo possível uma análise mais ampla.
Na verdade é bem mais simples.
Se ele quer desenvolver orientado a objeto, é porque ele sabe pra que serve e como funciona.
Se deu erro é porque está errado, simples assim.

Código: Selecionar todos

CLASS TPopUp INHERIT PopUp
   END CLASS
Se é herança que quer testar, está aí o menor exemplo possível.
Pra que serve o resto?
Quem colocou deveria saber, afinal... colocou o resto pra que?

Harbour

Enviado: 15 Abr 2019 08:50
por Jairo Maia
Olá Pessoal,
JoséQuintas escreveu:Se deu erro é porque está errado, simples assim.
Na minha opinião, o erro está no método PopUp que não retorna um objeto. Herdar herdou, mas veja a mensagem de erro:
LABREGO escreveu:Error BASE/3002 Super class 'POPUP' does not return an object: __CLSINSTSUPER

Harbour

Enviado: 15 Abr 2019 10:00
por JoséQuintas
Jairo Maia escreveu:Herdar herdou, mas veja a mensagem de erro:
Pegaram herança do defunto errado kkkkkkkkkkkkkkkkkkkkkkkkkk

LABREGO escreveu:Quando herdo a classe PopUp em uma classe qualquer ocorre o erro em tempo de execução:
Pela pergunta, parecia uma classe conhecida... do próprio Harbour.
Que classe é essa? Ela existe e funciona?

Harbour

Enviado: 15 Abr 2019 10:16
por JoséQuintas
É isto que está chamando de classe?

Código: Selecionar todos

   oPopUp := Popup()
   oPopUp:colorSpec := cColor
   oPopUp:AddItem( MenuItem( "&Prima nota", {|| NIL },, "Some msg 1" ) )
   oPopUp:AddItem( MenuItem( HB_MENU_SEPARATOR_UNI ) )
Pra quem vai fazer orientado a objeto... pressupõe-se que sabe o que é classe.

E pra quem vai fazer herança, pressupõe-se que pelo menos olhou como é a classe original.

Código: Selecionar todos

FUNCTION Popup( nTop, nLeft, nBottom, nRight )
Put. que par...
Isso lembra quem pergunta sobre ADVPL....