[RISOLTO] Classi con eventi

di il
15 risposte

[RISOLTO] Classi con eventi

Salve a tutti. Vengo dal mondo c++ e sto cercando
di creare delle classi in java, ma ho delle perplessità:
come si passano i puntatori a funzioni? o meglio come si può
implementare una sorta di evento che la classe invoca in base a un suo codice?
Faccio un esmpio:
ho la seguente classe

public class miaclasse
{
   public [i]Event[/i] OnEventoPositivo, OnEventoNegativo;  //questi dovrebbero essere 
                                                                                         //dei puntatori a funzione
   public miaclasse() 
   { 
	  //codice del costruttore.......
   }
   public void Analizza(int n)
  {
       if(n>=0) OnEventoPositivo;
        else  OnEventoNegativo;
  }  
}
la classe sopra la vorrei instanziare e usare tipo così:

     miaclasse obj= new miaclasse();
     obj.OnEventoPositivo= Funzione1;
     obj.OnEventoNegativo= Funzione2;
     miaclasse.Analizza(-1);
     mialcasse.Analizza(1);
void Funzione1()
{
   //codice vario
}
void Funzione2()
{
  //altro codice
}
quando invoco miaclasse.Analizza(-1) dovrebbe avviarmi la Funzione1 e quando invoco mialcasse.Analizza(1) dovrebbe avviarmi la Funzione2.
In C lo faccio con i puntatori a funzione(stupendi) ma in java come si fa?
ciao e grazie.

15 Risposte

  • Re: [RISOLTO] Classi con eventi

    In java non esistono i puntatori a funzione.
    fai un if...
    se il valore è maggiore di 0 avvia la funzione1 con il tuo/tuoi parametri, altrimenti fai partire la funzione2.
    Direi che è molto più lineare.
    C e C++ li ho fatti anch'io in ambito accademico e sopratutto C è bellissimo e il campo delle applicazione su cui puoi lavorare è vasto, ma Java è potente visto che è un linguaggio ad oggetti(come c++ fra l'altro) e miriadi di librerie su cui puoi lavorare.
  • Re: [RISOLTO] Classi con eventi

    Grazie mille per la tua risposta.
    Il punto è che se utilizzo un "IF" dovrei portare tutto il codice fuori dalla classe!
    Non mi sembra un approccio in linea con la stupenda filosofia delle classi.
    Comunque ho visto fare delle cose analoghe a quello che chiedo in java.
    Per esempio in campo android ho visto che quando si inserisce un
    Pulsante grafico esso ha il sistema di gestioni di eventi.ù
    guarda un po'
    final Button button= (Button) findViewById(R.id.button1);
    		button.setOnClickListener
    	        (
    	         new View.OnClickListener()  
    	         {
    	        	@Override
    	 			public void onClick(View v) 
    	 			{
    	        		/......codice vario	        		
    	 			}
    	         }	
    	        );
    la classe Button ha un metodo setOnClickListener che mi permette di assegnare un evento alla
    funzione OnClick(quindi la funzione OClick viene evocata dall'evento). Io vorrei fare una classe analoga a Button. come si fa? Cioè vorrei creare una classe MyClass con un metodo setOnMyEvento cosi poi da fare una assegnazione ad una funzione esterna MyFunction così:
     MyCLass newcl=new MyClass;
    		newcl.setOnMyEvento
    	        (
    	         new ......  
    	         {
    	        	@Override
    	 			public void MyFunction() 
    	 			{
    	        		/......codice vario	        		
    	 			}
    	         }	
    	        )
    come dovrei implementare tale classe?

  • Re: [RISOLTO] Classi con eventi

    Non è proprio così.

    OnClickListener è un interfaccia che contiene solo il metodo onClick()

    La classe che hai definito come listener implementa l'interfaccia OnClickListener (e quindi contiene necessariamente il metodo onClick, che verrà chiamato dal Button quando registra un evento)
  • Re: [RISOLTO] Classi con eventi

    ale99 ha scritto:


    Non è proprio così.

    OnClickListener è un interfaccia che contiene solo il metodo onClick()

    La classe che hai definito come listener implementa l'interfaccia OnClickListener (e quindi contiene necessariamente il metodo onClick, che verrà chiamato dal Button quando registra un evento)
    Sempre grazie per la tua attenzione.
    E quindi? cosa si fa?
    quando hanno inventato la classe Button i programmatori si saranno posti il problema di gestire degli eventi e quindi hanno aggirato l'ostacolo con l'interfaccia OnClickListener. E mi sta bene
    Adesso io voglio creare una MyClass e una interfaccia MyEvent. Come faccio? lo posso fare? quali sono i modi per aggirare l'ostacolo?
  • Re: [RISOLTO] Classi con eventi

    Adesso io voglio creare una MyClass e una interfaccia MyEvent. Come faccio? lo posso fare? quali sono i modi per aggirare l'ostacolo?
    Certo che si può! mica hanno usato la magia

    Puoi implementare la cosa come ti piace di più! Basta che funzioni


    Questo è un esempio che spero ti possa fornire uno spunto:
    public class Main {
    
        
        public static void main(String[] args) {
            MyClass myclass = new MyClass();
           
            
            /*equivale a :
            myclass.setOnEventoListener(50, new MyEvent(){
                @Override
                public void onEvent() {
                    System.out.println("ciao =)");
                }
            });
            */
            try{
                myclass.setOnEventoListener(50, () -> {
                    System.out.println("ciao =)");
                });
            }catch(RuntimeException e){
                e.printStackTrace();
            }
            
            
         
            myclass.analizza(10);
            
            myclass.setOnEventoListener(MyClass.EVENTO_POSITIVO, () -> {
                System.err.println("Numero positivo!");
            });
            
            myclass.setOnEventoListener(MyClass.EVENTO_NEGATIVO, () -> {
                System.err.println("Numero negativo!");
            });
            
            myclass.analizza(10);
            myclass.analizza(0);
            myclass.analizza(-10);
            
            
            myclass.setOnEventoListener(MyClass.EVENTO_NEGATIVO, null);
            
            myclass.analizza(10);
            myclass.analizza(0);
            myclass.analizza(-10);
            
        }
    
    }
    public interface MyEvent {
        public void onEvent();
    }
    public class MyClass {
        private MyEvent onEvento[];
        
        final static public int EVENTO_POSITIVO = 0;
        final static public int EVENTO_NEGATIVO = 1;
        
        final static private int NUM_EVENTI = 2;
        
        public MyClass(){
            onEvento = new MyEvent[NUM_EVENTI];
            
            for(int i = 0; i < NUM_EVENTI; i++)
                onEvento[i] = null;
        }
                
        public void setOnEventoListener(int type, MyEvent listener) throws RuntimeException{
            if(type < 0 || type >= NUM_EVENTI)
                throw new RuntimeException("Invalid event type");
            
            onEvento[type] = listener;
        }
        
        private void callListener(int type){
            if(onEvento[type]!=null){
                onEvento[type].onEvent();
            }
        }
        
        public void analizza(int n){
           if(n>=0) callListener(this.EVENTO_POSITIVO);
            else  callListener(this.EVENTO_NEGATIVO);
        }  
    }
    
  • Re: [RISOLTO] Classi con eventi

    Le informazioni che ti servono sono legate ai srguenti concetti:

    1) inner classes, per l'implementazione di una classe che implementa un'interfaccia, al volo (ovviamente c'e' sempre la soluzione canonica, con le classi normali).

    2) il concetto di listener, con cui si implementa il concetto di evento in Java, e su cui sono basate le Swing

    Per i dettagli, ci sono decinaia di libri che lo spiegano
  • Re: [RISOLTO] Classi con eventi

    Ok grazie mille.
    Non mi spaventa dover studiare, mi spaventa non sapere da dove cominciare.
  • Re: [RISOLTO] Classi con eventi

    migliorabile ha scritto:


    Le informazioni che ti servono sono legate ai srguenti concetti:

    1) inner classes, per l'implementazione di una classe che implementa un'interfaccia, al volo (ovviamente c'e' sempre la soluzione canonica, con le classi normali).

    2) il concetto di listener, con cui si implementa il concetto di evento in Java, e su cui sono basate le Swing

    Per i dettagli, ci sono decinaia di libri che lo spiegano
    Ok ho studiato. Cose che già intuivo e in parte conoscevo. Ma manca una cosa
    essenziale: la possibilità di creare degli eventi personalizzati. Non credo che
    non esista modo per farlo, anzi esistono programmi che lo fanno!
    Gli esempi che ho trovato si poggiano su eventi quali movimenti mouse, click, button pressed,
    button release, ecc. Ma se voglio creare un evento mio, che so, OnTempChanged che interviene se la temperatura di un sensore cambia (faccio un esempio) ci deve essere il modo di farlo evitando di mettere un loop a controllo del sensore.
    Esiste un programma, Lama per android, che ha la possibilità di creare eventi personalizzati. Tranne se non utilizza l'NDK... questo non lo so. Allora se così fosse diciamo chiaramente che per personalizzare gli eventi dobbiamo ricorrere al C. Corregetemi se mi sbaglio.
    Ciao e sempre grazie.
  • Re: [RISOLTO] Classi con eventi

    In c passi un puntatore a funzione.

    In java crei un'interfaccia che contiene il prototipo della funzione. Nella classe che genera l'evento richiami il metodo dall'interfaccia, a cui hai precedentemente assegnato una classe che implementa l'interfaccia. Se esamini il codice che ti ho fornito forse capisci meglio il concetto.

    Non saprei come spiega lo meglio...
  • Re: [RISOLTO] Classi con eventi

    ale99 ha scritto:


    In c passi un puntatore a funzione.

    In java crei un'interfaccia che contiene il prototipo della funzione. Nella classe che genera l'evento richiami il metodo dall'interfaccia, a cui hai precedentemente assegnato una classe che implementa l'interfaccia. Se esamini il codice che ti ho fornito forse capisci meglio il concetto.

    Non saprei come spiega lo meglio...
    Caspita!!!!
    Ale99 ti chiedo umilmente scusa! non avevo visto, e non mi spiego come mai, il tuo codice.
    E' proprio ciò che cercavo! Domani ci metterò mani e lo comincerò a studiare benino benino.
    grazie.
  • Re: [RISOLTO] Classi con eventi

    Ale99 hai colpito nel segno.
    ho provato il codice ed è ok.
    L'ho pure trasportato su Android.
    grazie.
  • Re: [RISOLTO] Classi con eventi

    Prego

    Se non capisci qualcosa o ti servono altri chiarimenti chiedi pure
  • Re: [RISOLTO] Classi con eventi

    ale99 ha scritto:


    Prego

    Se non capisci qualcosa o ti servono altri chiarimenti chiedi pure
    grazie ale99 sembra tutto chiaro fin quì.
    ho ripulito un po' il codice e l'ho postato in un tutorial quì
    http://www.iprogrammatori.it/forum-programmazione/android/eventi-personalizzati-android-myevent-t23568.html
    facendo il tuo nome.
    Credo che ciò possa essere d'aiuto per chi in futuro avrà i miei stessi dubbi. che ne pensi?
    ciao.
  • Re: [RISOLTO] Classi con eventi

    Benissimo!

    Ciao
Devi accedere o registrarti per scrivere nel forum
15 risposte