Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    problemino con ereditarietà

    salve ragazzi ho un piccolo problema che non riesco a risolvere.
    ho due classi e una estende l'altra.
    credo di non aver chiara l'implementazione dell'ereditarietà anche se concettualmente pernso di averla capita.
    facendo in questo modo mi da un errore nella classe applicazioneCentroControllo
    in particolare non trova il costruttore dell applicazione grafica...come dovrei fare?grazie anticipatamente

    la mia idea era quella di fare una sola applicazione grafica per entrambe e ho fatto così:
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class CentroControlloGUI extends JFrame implements ActionListener{
    	
    	private Container c;
    	private CentroControlloMilitare cc;
    	private JButton b1,b2,b3,b4,b5,b6;
    	
    	public CentroControlloGUI(CentroControlloMilitare cc)
    	{
    		this.cc=cc;
    		setTitle(" Centro di controllo" + cc.getID());
    		setLayout(new GridLayout(2,2));
    		
    		c=new Container();
    		c=getContentPane();
    		
    		b1 = new JButton("inserisci volo");
    		b2= new JButton("cancella volo");
    		c.add(b1);
    		c.add(b2);
    		b1.addActionListener(this);
    		b2.addActionListener(this);
    		
    		if(cc instanceof CentroControlloMilitare)
    		{
    			b3= new JButton("visualizza partenze");
    			b4= new JButton("visualizza arrivi");
    			b5= new JButton("visualizza voli per tipologia");
    			b6= new JButton("salva report");
    			c.add(b3);
    			c.add(b4);
    			c.add(b5);
    			c.add(b6);
    			b3.addActionListener(this);
    			b4.addActionListener(this);
    			b5.addActionListener(this);
    			b6.addActionListener(this);
    		}
    		
    		pack();
    		setVisible(true);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    	}
    	
    	public void actionPerformed(ActionEvent e)
    	{
    		String message=null;
    		String id=null;
    		String arr=null;
    		String par=null;
    		String tipologia=null;
    		String report= "REPORT: \n";
    		if(e.getSource()==b1)
    		{
    			id=JOptionPane.showInputDialog("inserisci il codice del volo: ");
    			par=JOptionPane.showInputDialog("inserisci l'aeroporto di partenza del volo: ");
    			arr=JOptionPane.showInputDialog("inserisci l'aeroporto di destinazione del volo: ");
    			tipologia=JOptionPane.showInputDialog("inserisci la tipologia del volo: ");
    			
    			Volo v = new Volo(id,par,arr,tipologia);
    			message=cc.inserisciVolo(v);
    			JOptionPane.showMessageDialog(null,message);
    		}
    		else if(e.getSource()==b2)
    		{
    			id=JOptionPane.showInputDialog("inserisci il codice del volo: ");
    			message=cc.cancellaVolo(id);
    			JOptionPane.showMessageDialog(null,message);
    		}
    		else if(e.getSource()==b3)
    		{
    			par=JOptionPane.showInputDialog("inserisci aeroporto di partenza ");
    			message=cc.visualizzaPartenze(par);
    			JOptionPane.showMessageDialog(null,message);
    			report = report+ message + "\n";
    		}
    		else if(e.getSource()==b4)
    		{
    			arr=JOptionPane.showInputDialog("inserisci aeroporto di destinazione ");
    			message=cc.visualizzaArrivi(arr);
    			JOptionPane.showMessageDialog(null,message);
    			report = report+ message + "\n";
    		}
    		else if(e.getSource()==b5)
    		{
    			tipologia=JOptionPane.showInputDialog("inserisci tipologia di volo ");
    			message=cc.visualizzaVoliPerTipologia(tipologia);
    			JOptionPane.showMessageDialog(null,message);
    			report=report+message + "\n";
    		}
    	}
    }
    vi posto anche le classi e i relativi main

    codice:
    import java.net.*;
    import java.io.*;
    
    public class CentroControllo{
    	protected  Integer id;
    	protected int porta;
    	protected String indirizzo;
    	
    	public CentroControllo(Integer id,int porta,String indirizzo)
    	{
    		this.porta=porta;
    		this.id=id;
    		this.indirizzo=indirizzo;
    	}
    	public Integer getID()
    	{
    		return id;
    	}
    	public String getIndirizzo()
    	{
    		return indirizzo;
    	}
    	public int getPorta()
    	{
    		return porta;
    	}
    	
    	public String inserisciVolo(Volo v)
    	{
    		String message="";
    		
    		try{
    			Socket s = new Socket(indirizzo,porta);
    			ObjectInputStream is = new ObjectInputStream(s.getInputStream());
    			ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
    			
    			os.writeObject(1);
    			
    			os.writeObject(v);
    			
    			message=(String)is.readObject();
    			
    			s.close();
    			is.close();
    			os.close();
    		}catch(Exception e){
    			System.err.println(e.getMessage());
    		}
    		return message;
    	}
    	
    	public String cancellaVolo(String ID)
    	{
    		String message="";
    		
    		try{
    			Socket s = new Socket(indirizzo,porta);
    			ObjectInputStream is = new ObjectInputStream(s.getInputStream());
    			ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
    			
    			os.writeObject(2);
    			
    			os.writeObject(ID);
    			
    			message=(String)is.readObject();
    			
    			s.close();
    			is.close();
    			os.close();
    		}catch(Exception e){
    			System.err.println(e.getMessage());
    		}
    		return message;
    	}
    }
    codice:
    import java.net.*;
    import java.io.*;
    
    public class CentroControlloMilitare extends CentroControllo{
    	
    	public CentroControlloMilitare(Integer id,int porta,String indirizzo)
    	{
    		super(id,porta,indirizzo);
    	}
    	
    	public String visualizzaPartenze(String aeroporto)
    	{
    		String message="";
    		
    		try{
    	
    			Socket s = new Socket(indirizzo,porta);
    			ObjectInputStream is = new ObjectInputStream(s.getInputStream());
    			ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
    			
    			os.writeObject(3);
    			
    			os.writeObject(aeroporto);
    			
    			message=(String)is.readObject();
    			
    			s.close();
    			is.close();
    			os.close();
    		}catch(Exception e){
    			System.err.println(e.getMessage());
    		}
    		return message;
    	}
    	
    	public String visualizzaArrivi(String aeroporto)
    	{
    		String message="";
    		
    		try{
    			Socket s = new Socket(indirizzo,porta);
    			ObjectInputStream is = new ObjectInputStream(s.getInputStream());
    			ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
    			
    			os.writeObject(4);
    			
    			os.writeObject(aeroporto);
    			
    			message=(String)is.readObject();
    			
    			s.close();
    			is.close();
    			os.close();
    		}catch(Exception e){
    			System.err.println(e.getMessage());
    		}
    		return message;
    	}
    	public String visualizzaVoliPerTipologia(String tipologia)
    	{
    		String message="";
    		
    		try{
    			Socket s = new Socket(indirizzo,porta);
    			ObjectInputStream is = new ObjectInputStream(s.getInputStream());
    			ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
    			
    			os.writeObject(5);
    			
    			os.writeObject(tipologia);
    			
    			message=(String)is.readObject();
    			
    			s.close();
    			is.close();
    			os.close();
    		}catch(Exception e){
    			System.err.println(e.getMessage());
    		}
    		return message;
    	}
    }
    codice:
    public class ApplicazioneCentroControllo
    {
    	public static void main(String args[])
    	{
    		try{
    			Integer id=null;
    			id=id.parseInt(args[0]);
    			CentroControllo cc = new CentroControllo(id,12345,"localhost");
    			CentroControlloGUI g = new CentroControlloGUI(cc);
    		}catch(ArrayIndexOutOfBoundsException e){
    			System.err.println("inserisci l'id del centro di controllo");
    		}
    	}
    }
    public class ApplicazioneControlloMilitare{
    	
    	public static void main(String args[])
    	{
    		try{
    			Integer id=null;
    			id=id.parseInt(args[0]);
    			CentroControlloMilitare cc = new CentroControlloMilitare(id,12345,"localhost");
    			CentroControlloGUI g = new CentroControlloGUI(cc);
    		}catch(ArrayIndexOutOfBoundsException e){
    			System.err.println("inserisci l'id del centro di controllo");
    		}
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Dire che lancia un errore è troppo generico..compilazione o runtime?

    Al momento non posso provare il codice, ma credo d'aver notato alcune cose.

    codice:
    public CentroControlloGUI(CentroControlloMilitare cc)
    Il costruttore è dichiarato così, ma tu passi un CentroControllo, non CentroControlloMilitare. Devi utilizzare come parametro la superclasse, altrimenti non funziona. Ricordati poi che se devi utilizzare una sottoclasse (CentroControlloMilitare) è necessario un cast (consiglierei prima di utilizzare instanceof, come stai già facendo).

    Dichiarare una variabile come int o come Integer ai fini pratici diciamo che non cambia nulla. In quanto avviene tutto grazie all'autoboxing.

    Il Socket che crei dovrebbe restare aperto...ed attento perchè avrai problemi con la GUI probabilmente.
    Crealo al momento della connessione, ma non continuare ad ogni scambio di informazioni ad aprire un Socket.

    Per accedere alle variabili della superclasse potresti/dovresti utilizzare i metodi di cui è ecquipaggiata

    Al momento mi vengono in mente solo queste cose.

  3. #3
    hai ragione per il riferimento infatti già ieri sera lo avevo cambiato... il problema è che facendo così adesso non riesce a trovare i metodi che chiamo all interno della classe CentroControlloGUI che dovrebbe gestire entrambi gli oggetti visto che adesso ho fatto così:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.io.*;
    
    public class CentroControlloGUI extends JFrame implements ActionListener{
    	
    	private Container c;
    	private CentroControllo cc;
    	private JButton b1,b2,b3,b4,b5,b6;
    	
    	public CentroControlloGUI(CentroControllo cc)
    	{
    		this.cc=cc;
    		setTitle(" Centro di controllo" + cc.getID());
    		setLayout(new GridLayout(3,2));
    		
    		c=new Container();
    		c=getContentPane();
    		
    		b1 = new JButton("inserisci volo");
    		b2= new JButton("cancella volo");
    		c.add(b1);
    		c.add(b2);
    		b1.addActionListener(this);
    		b2.addActionListener(this);
    		
    		if(cc instanceof CentroControlloMilitare)
    		{
    			CentroControlloMilitare cm=cc;
    			b3= new JButton("visualizza partenze");
    			b4= new JButton("visualizza arrivi");
    			b5= new JButton("visualizza voli per tipologia");
    			b6= new JButton("salva report");
    			c.add(b3);
    			c.add(b4);
    			c.add(b5);
    			c.add(b6);
    			b3.addActionListener(this);
    			b4.addActionListener(this);
    			b5.addActionListener(this);
    			b6.addActionListener(this);
    		}
    		
    		pack();
    		setVisible(true);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    	}
    	
    	public void actionPerformed(ActionEvent e)
    	{
    		String message=null;
    		String id=null;
    		String arr=null;
    		String par=null;
    		String tipologia=null;
    		String report= "REPORT: \n";
    		if(e.getSource()==b1)
    		{
    			id=JOptionPane.showInputDialog("inserisci il codice del volo: ");
    			par=JOptionPane.showInputDialog("inserisci l'aeroporto di partenza del volo: ");
    			arr=JOptionPane.showInputDialog("inserisci l'aeroporto di destinazione del volo: ");
    			tipologia=JOptionPane.showInputDialog("inserisci la tipologia del volo: ");
    			
    			Volo v = new Volo(id,par,arr,tipologia);
    			message=cc.inserisciVolo(v);
    			JOptionPane.showMessageDialog(null,message);
    		}
    		else if(e.getSource()==b2)
    		{
    			id=JOptionPane.showInputDialog("inserisci il codice del volo: ");
    			message=cc.cancellaVolo(id);
    			JOptionPane.showMessageDialog(null,message);
    		}
    		else if(e.getSource()==b3)
    		{
    			par=JOptionPane.showInputDialog("inserisci aeroporto di partenza ");
    			message=cc.visualizzaPartenze(par);
    			JOptionPane.showMessageDialog(null,message);
    			report = report+ message + "\n";
    		}
    		else if(e.getSource()==b4)
    		{
    			arr=JOptionPane.showInputDialog("inserisci aeroporto di destinazione ");
    			message=cc.visualizzaArrivi(arr);
    			JOptionPane.showMessageDialog(null,message);
    			report = report+ message + "\n";
    		}
    		else if(e.getSource()==b5)
    		{
    			tipologia=JOptionPane.showInputDialog("inserisci tipologia di volo ");
    			message=cc.visualizzaVoliPerTipologia(tipologia);
    			JOptionPane.showMessageDialog(null,message);
    			report=report+message + "\n";
    		}
    		else
    		{
    			message="salvataggio efettuato con successo";
    			try{
    				FileWriter fw=new FileWriter("voli" + cc.getID() +".txt");
    				PrintWriter pw = new PrintWriter(fw);
    				pw.println(report);
    				pw.close();
    				fw.close();
    			}catch(Exception x){
    				message="salvataggio non andato a buon fine";
    			}
    				JOptionPane.showMessageDialog(null,message);
    			
    		}
    	}
    }
    ho cambiato solamente il tipo di riferimento richiesto dal costruttore mettendo quello della classe padre . così non mi da più l'errore all'interno del main ma non riesco proprio a capire perchè non mi trova i metodi della classe figlia che sono i casi 3,4,5,6.
    io credo di aver capito il problema, perchè al solito java non permette situazioni che potrebbero creare problemi,in quanto non sapendo a priori quale sara l'oggetto che chiamerà quei metodi non permette di farlo.
    ho provato a mettere un controllo prima ma non va lo stesso
    gli errori che mi da sono questi:

    CentroControlloGUI.java:79: cannot find symbol
    symbol : method visualizzaPartenze(java.lang.String)
    location: class CentroControllo
    message=cc.visualizzaPartenze(par);
    ^
    CentroControlloGUI.java:88: cannot find symbol
    symbol : method visualizzaArrivi(java.lang.String)
    location: class CentroControllo
    message=cc.visualizzaArrivi(arr);
    ^
    CentroControlloGUI.java:95: cannot find symbol
    symbol : method visualizzaVoliPerTipologia(java.lang.String)
    location: class CentroControllo
    message=cc.visualizzaVoliPerTipologia(tipologia);

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Non sono riuscito a guardare bene il codice, ma sappi che utilizzando un riferimento di una superclasse, e chiamando dei metodi dichiarati solo da una sottoclasse, sei costretto ad effettuare il cast.

    Sarebbe molto meglio:
    codice:
    if(cc instanceof CentroControlloMilitare) {
      CentroControlloMilitare cm = (CentroControlloMilitare)cc;
    e poi richiamare il metodi (questo tipo di chiamate vengono risolte in compilazione, quindi viene guardato il tipo di oggetto, non quello a cui si riferisce: in altre parole, se utilizzi un CentroControllo per richiamare i metodi provaca sicuramente un errore in quanto, in CentroControllo quei metodi non esistono). Ovviamente, una volta avvenuto il cast, puoi richiamare tutti i metodi.

    EDIT:

    io credo di aver capito il problema, perchè al solito java non permette situazioni che potrebbero creare problemi,in quanto non sapendo a priori quale sara l'oggetto che chiamerà quei metodi non permette di farlo.
    Una sottoclasse può sempre richiamare i metodi di una superclasse (eccetti quelli privati). E' ovvio che se tu hai una superclasse che richiama i metodi di una sottoclasse questi non vengono trovati, in quanto la superclasse non può sapere che combinano le sottoclassi..ecco il motivo degli errori "cannot find symbol"

  5. #5
    adesso funziona tutto alla perfezione, ma non mi è piaciuta tanto questa soluzione.
    è un casting poco elegante ma mi sa che è l'unico modo per poterlo far funzionare con una sola interfaccia grafica.

    per il resto credete che rispetti tutti i concetti della programmazione object-oriented?

    grazie a tutti per il contributo

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Che intendi per "...è l'unico modo per poterlo far funzionare con una sola interfaccia grafica." ?
    Diciamo che la utilizzi...spero tu abbia anche corretto la questione dei Socket.

    Comunque non conoscendo il testo dell'esercizio non saprei dirti come l'avrei progettato io. ^^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.