[RISOLTO] Classi con eventi

di Anonimizzato16190 il
15 risposte
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

  • 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.
  • 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?

  • 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)
  • 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?
  • 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);
        }  
    }
    
  • 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 grazie mille.
    Non mi spaventa dover studiare, mi spaventa non sapere da dove cominciare.
  • 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.
  • 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...
  • 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.
  • Ale99 hai colpito nel segno.
    ho provato il codice ed è ok.
    L'ho pure trasportato su Android.
    grazie.
  • Prego

    Se non capisci qualcosa o ti servono altri chiarimenti chiedi pure
  • Benissimo!

    Ciao
Devi accedere o registrarti per scrivere nel forum
15 risposte