Autore Topic: [RISOLTO] Chliamata di una funzione dalla classe padre ad una classe figlia  (Letto 1610 volte)

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Non so se sto affrontando il problema in modo sbagliato, ma vado a descrivere cosa vorrei fare. Devo creare un progetto che contiene un gruppo di oggetti con funzioni identiche compreso un timer che deve richiamare una sub specializzata diversa per ogni oggetto del gruppo. L'idea è quella di raggruppare tutte le funzioni, compreso il timer, in una classe dalla quale derivare con il comando inherit ogni singolo oggetto contenente la sub specializzata. Qui però, mi sono arenato perchè non so come (e non so nemmeno se sia possibile) richiamare dal timer della classe padre, la sub presente nella classe derivata.

Grazie per il disturbo.
Giovanni Grandi
« Ultima modifica: 12 Dicembre 2013, 16:59:49 da g.grandi »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Chiamata di una funzione dalla classe padre ad una classe figlia
« Risposta #1 il: 10 Dicembre 2013, 23:27:37 »
Se non ho capito male  :-X , vi è una Classe sostanzialmente principale che contiene il Timer, il quale con una certa frequenza richiama molte sub-procedure, oppure funzioni, contenute in altrettante Classi secondarie.
Se è così, direi che devi cominciare a dichiarare ed instanziare le Classi secondarie. Poi........
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Chliamata di una funzione dalla classe padre ad una classe figlia
« Risposta #2 il: 11 Dicembre 2013, 06:08:11 »
Classe padre
Public sub TuoTimer_Timer ()

  Me.TuaSub ()

End


Classe figlia
Public Sub TuaSub ()

  'Codice diverso per ogni sub figlia

End

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Chiamata di una funzione dalla classe padre ad una classe figlia
« Risposta #3 il: 11 Dicembre 2013, 09:50:31 »
Vedi ? Milio è stato più risolutivo: bando alle ciance !   ;D

Lui ha posto una sola Classe secondaria che va a contenere più sub-procedure, tante quante sono gli oggetti.

Ma tu la parola Inherits devi assolutamente impostarla ?
« Ultima modifica: 11 Dicembre 2013, 10:05:33 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Chliamata di una funzione dalla classe padre ad una classe figlia
« Risposta #4 il: 11 Dicembre 2013, 10:57:50 »

Ammetto che sono alle prime armi con l'uso delle classi! L'esempio di Milio è una variante alla mia esigenza e può andare, ma ho comunque il problema che quando viene eseguita la Me.TuaSub() mi riporta l'errore che la TuaSub è sconosciuta nella classe padre. Cerco di fare una sintesi del mio codice:

Classe Padre  ----------------------

Public Sub _new()

  ...
  TuoTimer = NEW Timer AS "TuoTimer"
  TuoTimer.Enabled = FALSE


End Sub

Public sub TuoTimer_Timer ()

  Me.TuaSub ()

End

Public Sub Start()

  TuoTimer.Delay = 100
  TuoTimer.Enabled = TRUE 

End Sub

fine classe padre  --------------------


Classe Figlia  ---------------------

INHERIT Padre

Public Sub _new()

  ....

End Sub

Public Sub TuaSub ()

  'Codice diverso per ogni sub figlia

End

fine classe figlia --------------------


FMain.Class  ------------------

PUBLIC oggetto AS NEW Figlia(....)

Object.Attach(oggetto, ME, "MiaFiglia")

oggetto.Start()

fine Main  ------------------


Grazie, Giovanni

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Chiamata di una funzione dalla classe padre ad una classe figlia
« Risposta #5 il: 11 Dicembre 2013, 12:17:47 »
FMain.Class  ------------------

Codice: gambas [Seleziona]
PUBLIC oggetto AS NEW Figlia(....)

Object.Attach(oggetto, ME, "MiaFiglia")

oggetto.Start()


fine Main  ------------------

A me dà errore alla riga oggetto.Start() in quanto nella Classe figlia, chiamata oggetto, non c'è quella funzione ".start()".

Ritengo, inoltre, che, qualora tu non debba far sollevare eventi dalla Classe secondaria figlia, la riga
Codice: gambas [Seleziona]
Object.Attach(oggetto, ME, "MiaFiglia")

diventa superflua, in quanto tu istanzi la figlia già con la precedente riga:
Codice: gambas [Seleziona]
PUBLIC oggetto AS NEW Figlia

alla quale fra l'altro non vanno aggiunte quelle parantesi.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Chliamata di una funzione dalla classe padre ad una classe figlia
« Risposta #6 il: 11 Dicembre 2013, 14:48:08 »
Ho creato l'esempio semplificato (che allego) dove si presenta l'errore alla chiamata di Me.TuaSub().

Citazione
A me dà errore alla riga oggetto.Start() in quanto nella Classe figlia, chiamata oggetto, non c'è quella funzione ".start()".
Nell'esempio allegato non presenta questo problema.

Citazione
Ritengo, inoltre, che, qualora tu non debba far sollevare eventi dalla Classe secondaria figlia, la riga
Codice: gambas
view plaincopy to clipboardprint?

    Object.Attach(oggetto, ME, "MiaFiglia") 

diventa superflua, in quanto tu istanzi la figlia già con la precedente riga:
Nel programma ho la necissità di sollevare eventi.

Citazione
Codice: gambas
view plaincopy to clipboardprint?

    PUBLIC oggetto AS NEW Figlia 

alla quale fra l'altro non vanno aggiunte quelle parantesi.
Le ho messe solo per richiamare l'attenzione che avevo dei parametri da passare alla sub _new

Ciao, Giovanni

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Chliamata di una funzione dalla classe padre ad una classe figlia
« Risposta #7 il: 11 Dicembre 2013, 16:15:49 »
Citazione
A me dà errore alla riga oggetto.Start() in quanto nella Classe figlia, chiamata oggetto, non c'è quella funzione ".start()".
Nell'esempio allegato non presenta questo problema.

Sì, scusami, avevo dimenticato  :hard: di porre la parola Inherits nella Classe figlia !



Riguardo al problema principale da te sollevato, devi individuare bene la Classe per richiamare i suoi simboli. Pertanto, la sub-routine TuoTimer va modificata come segue:
Codice: gambas [Seleziona]
Public Sub TuoTimer_Timer()

   FMain.oggetto.TuaSub()

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline g.grandi

  • Gambero
  • **
  • Post: 51
    • Mostra profilo
Re: Chliamata di una funzione dalla classe padre ad una classe figlia
« Risposta #8 il: 11 Dicembre 2013, 16:46:14 »

Grazie del suggerimento. Come al solito mi annego nel classico bicchiere d'acqua.

Ho aggiunto un metodo nella classe padre al quale passo il riferimento della classe figlia creata. In questo modo posso tenere la classe padre generica da utilizzare per tutti gli oggetti derivati.

Ciao, Giovanni