Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99

    Problema con la reflection

    Salve ho il seguente problema con la reflection:



    public class Boot {

    public static void main(String args[]){

    Random rng = new Random();
    String[] mezzi = new String[3];
    mezzi[0] = "Bicicletta";
    mezzi[1] = "CicloMotore";
    mezzi[2] = "MotoCiclo";

    try{
    Class prova = Class.forName(mezzi[rng.nextInt(3)]);
    Object m1 = prova.newInstance();
    System.out.println("Sono una" +m1.getClass().getName());
    }catch(Exception e){
    e.getMessage();
    }
    }

    }

    Il problema è che dinamicamente provo a crearmi un oggetto a caso tra bicicletta, ciclomotore e motociclo usando la classe Class, però il metodo newistance() mi restituisce un object, comde devo fare a creare l'oggetto bicicletta, ciclomotore o motociclo??perchè poi devo usare i loro metodi...logicamente il cast non và bene perchè io non conosco l'oggetto che viene istanziato tra i 3 dinamicamente(infatti uso un random)..

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema con la reflection

    Originariamente inviato da doping
    Il problema è che dinamicamente provo a crearmi un oggetto a caso tra bicicletta, ciclomotore e motociclo usando la classe Class, però il metodo newistance() mi restituisce un object, comde devo fare a creare l'oggetto bicicletta, ciclomotore o motociclo??perchè poi devo usare i loro metodi...logicamente il cast non và bene perchè io non conosco l'oggetto che viene istanziato tra i 3 dinamicamente(infatti uso un random)..
    Dipende da cosa devi fare e da come sono definite le tre classi. Ad esempio estendono una classe Veicolo? A questo punto usi il polimorfismo. Fai un cast a Veicolo e tratti l'oggetto in modo polimorfico.
    Cioè .... Veicolo ha ad esempio un metodo accelera(), allora tutte le classi lo avranno (magari ridefinito, per specializzarlo). Quindi non ti interessa tanto sapere se un oggetto è una Bicicletta o un MotoCiclo ....

    Non so se mi sono spiegato ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    La traccia è la seguente:

    Esistono 3 mezzi di locomozione a due ruote: bicicletta, ciclomotore, motociclo. Il primo è caratterizzato dal NomeProprietario, il secondo ha una targa ed il terzo ha cilindrata e targa. Tutti sono gestiti attraverso i metodi: start(), stop(), accelera(), frena(), getSpeed(). Quest’ultimo ritorna il valore della velocità corrente. accelera() incrementa del 10% ad ogni chiamata e frena() riduce del 50% la velocità. start() fissa la velocità a 5 Km/h per la bicicletta, a 20 Km/h per il ciclomotore e a 60 Km/h per il motociclo. Scrivere le 3 classi Java che implementano le 3 tipologie di mezzo di locomozione descritte.
    Scrivere una classe Java che nel metodo main istanzia 10 oggetti a caso tra le 3 classi definite precedentemente. Avviare tutti i mezzi con il metodo start() e successivamente invocare a caso 50 volte o il metodo accelera() o il metodo frena(). Al termine calcolare la velocità media dei 10 mezzi di locomozione.

    ed ecco come ho implementato io:

    public class Veicolo {

    protected int speed;

    public void start(int velocita){
    speed = velocita;
    }

    public void stop(){
    speed = 0;
    }

    public void accellera(){
    speed += (speed*10)/100;
    System.out.println("La " + this.getClass().getName() + "ha accellerato");
    }

    public void frena(){
    speed -= (speed*50)/100;
    }

    public int getSpeed(){
    return speed;
    }
    }



    public class Bicicletta extends Veicolo{

    private String nomeProprietario;

    public Bicicletta(String nome){
    nomeProprietario = nome;
    }

    public void start(){
    super.start(5);
    }

    }


    public class CicloMotore extends Veicolo{

    private String targa;

    public CicloMotore(String targa){
    this.targa = targa;
    }

    public void start(){
    super.start(20);
    }

    }



    public class MotoCiclo extends Veicolo{

    private int ciclindrata;
    private String targa;

    public MotoCiclo(int cilindrata, String targa){
    this.ciclindrata = ciclindrata;
    this.targa = targa;
    }

    public void start(){
    super.start(60);
    }

    }



    Adesso arrivato al punto di fare il main potrei scegliere di usare uno switch-case e mi creo i 10 oggetti a caso, ma voglio fare 1 cosa + seria e quindi crearli nel modo che ho mostrato nel primo post, non credo di poter fare 1 cosa come mi hai detto tu, cioè di usare il polimorfismo perchè nella traccia è espresso che vengano creati dei mezzi specializzati(bici, ciclomotore...) e non dei veicoli...spero di esser stato + chiaro.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da doping
    Adesso arrivato al punto di fare il main potrei scegliere di usare uno switch-case e mi creo i 10 oggetti a caso, ma voglio fare 1 cosa + seria e quindi crearli nel modo che ho mostrato nel primo post
    Beh, la reflection non è strettamente necessaria (se fosse richiesto nel testo, allora ok .... ma non lo è).

    Originariamente inviato da doping
    non credo di poter fare 1 cosa come mi hai detto tu, cioè di usare il polimorfismo perchè nella traccia è espresso che vengano creati dei mezzi specializzati
    Appunto ... trattare una istanza di Bicicletta come un Veicolo, trattare una istanza di MotoCiclo come Veicolo, ecc...
    Il nocciolo è proprio quello!!!

    codice:
    Veicolo[] veicoli = new Veicolo[10];
    Random rnd = new Random ();
    
    for (int i = 0; i < veicoli.length; i++)
    {
        switch (rnd.nextInt (3))
        {
            case 0: veicoli[i] = new Bicicletta (); break;
            case 1: veicoli[i] = new MotoCiclo (); break;
            case 2: veicoli[i] = new CicloMotore (); break;
        }
    }
    
    for (int i = 0; i < veicoli.length; i++)
    {
        /* fai delle operazioni sui veicoli ... non ti frega cosa sono realmente */
    }
    ....
    Questo si chiama: polimorfismo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    ma io so esattamente cosa è il polimorfismo, volevo semplicemente provare a non fare switch-case, quella è una traccia di prova e non un esercizio da fare obbligatoriamente, così come lo hai fatto tu l'ho già fatto in un'altra versione dell'esercizio, solo che ho usato l'arraylist...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da doping
    volevo semplicemente provare a non fare switch-case
    Non è una questione di switch o no. Quello che ho fatto io era solo un esempio, tra l'altro non corrispondente nei costruttori rispetto alle tue classi.

    Se devi trattare N oggetti di tipo eterogeneo in modo comune (la stessa operazione su tutti gli oggetti ...) e le classi derivano dalla stessa classe, allora devi trattare gli oggetti "vedendoli" solo attraverso il tipo base. Questo è appunto il nocciolo del polimorfismo che, come dici, conosci bene.

    Quindi puoi avere Veicolo[] o ArrayList<Veicolo>, la questione non cambia. Quando devi avviare gli N veicoli poi far accelerare/frenare o determinare la velocità, non ti interessa tanto sapere se uno dei veicoli è una Bicicletta o un MotoCiclo.

    Come poi andrai a creare e popolare un array o un ArrayList dei veicoli è un'altra questione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    Ho capito, ed ho cambiato così :

    public static void main(String args[]){

    Veicolo v = new Veicolo();
    try{
    Class cl1 = Class.forName("MezziLocomotivi.CicloMotore");
    v = (Veicolo)cl1.newInstance();
    }catch(Exception e){
    System.out.println("classe non trovata");
    }
    }


    però adesso il problema è che non và bene il percorso MezziLocomotivi.CicloMotore infatti mi cade sempre in eccezzione....ho provato a mettere anche solo il nome della classe, sul manuale non è specificato nulla, e sul mio libro java cè scritto di mettere package.nomeclasse, io la classe la tengo nel seguente percorso ...\workspace\Lp2Uni\bin\MezziLocomotivi

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    che eccezione ti da? Posta lo stacktrace.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    public static void main(String args[]){

    Object v;
    try{
    Class cl1 = Class.forName("MezziLocomotivi.Bicicletta");
    v = cl1.newInstance();
    }catch(Exception e){
    e.printStackTrace();
    // System.out.println("classe non presente");
    }
    }


    errore :

    java.lang.InstantiationException: MezziLocomotivi.Bicicletta
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at MezziLocomotivi.Boot2.main(Boot2.java:10)

    non ho capito proprio

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Io, invece non ho capito perchè sei passato da una situazione che non faceva uso dei package a una che ne fa uso.

    Se vuoi usare i package devi fare in modo che le classi siano dentro alle cartelle corrette e che le classi stesse abbiano la clausola package all'inizio del file sorgente.

    Ma in questo specifico caso non ne vedo il motivo.


    La classe Bicicletta fa parte del package MezziLocomotivi? Ovvero, la classe Bicicletta comincia così:
    codice:
    package MezziLocomotivi;
    
    ...
    
    public class Motocicletta extends Veicolo {
    ...
    ?

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.