Overloading di metodi

di il
6 risposte

Overloading di metodi

Ciao, vi spiego il problema.
Ho realizzato un programma costituito da un interfaccia che mi definisce dei metodi e la relativa classe A di implementazione dei metodi. Ora ho bisogno di aggiungere un'altra classe B che estende la classe A, all'interno della quale devo mettere le stesse funzioni della classe A ma con qualche differenza, come ad esempio diversi parametri dei metodi. Ora se io ho un oggetto della classe A sul quale vorrei richiamare metodi di A o di B a seconda dei parametri che passo ai metodi stessi, come dovrei fare? Ho capito l'Override ma non tanto l'overloading, che è quello che probabilmente mi serve

6 Risposte

  • Re: Overloading di metodi

    Giuso ha scritto:


    Ora se io ho un oggetto della classe A sul quale vorrei richiamare metodi di A o di B a seconda dei parametri che passo ai metodi stessi, come dovrei fare? Ho capito l'Override ma non tanto l'overloading, che è quello che probabilmente mi serve
    Forse hai un po' di confusione ...

    Se hai una classe A con un metodo es. public void prova(String) , poi data una VARIABILE di tipo A:

    A varA = ......
    varA.prova("xyz");

    e data una classe B extends A: vuoi che se l'oggetto assegnato a varA è di tipo A allora il prova(String) eseguito è quello di A mentre se l'oggetto assegnato a varA è di tipo B allora il prova(String) eseguito è quello di B .... quello che serve qui si chiama override.

    Con l'overload (se B avesse un public void prova(int) quindi differente dal prova di A) questa invocazione "polimorfica" NON la puoi fare.
  • Re: Overloading di metodi

    Quindi se io volessi eseguire void prova(int) di B, dovrei per forza creare un oggetto in B? l'overloading quindi mi sembra di aver capito che può essere fatto solo nella stessa classe in cui ho i 2 metodi "diversi"?
  • Re: Overloading di metodi

    Giuso ha scritto:


    Quindi se io volessi eseguire void prova(int) di B, dovrei per forza creare un oggetto in B?
    Sì e, nota, tenendo un reference (variabile) di tipo B. Se assegni un oggetto B ad una variabile del supertipo (A) il metodo "nuovo" prova(int) NON lo "vedi" da un reference A !!

    Giuso ha scritto:


    l'overloading quindi mi sembra di aver capito che può essere fatto solo nella stessa classe in cui ho i 2 metodi "diversi"?
    No, l'overloading tra 2 metodi può avvenire nella stessa classe o tra una classe e la superclasse. Non è quello il punto.

    La questione è la "scelta" del metodo. Perché l'overloading viene risolto in fase di COMPILAZIONE, basandosi su ciò che il compilatore "sa" solo di un certo tipo (e sul tipo "statico" degli argomenti al metodo). Mentre l'overriding viene risolto a RUNTIME basandosi sull'oggetto realmente istanziato.
  • Re: Overloading di metodi

    Se invece di fare B extends A facessi B implements interfaccia (la stessa che implemente A) potrei fare ciò che mi serve? In pratica io ho questo oggetto in A che può avere o meno una caratteristica; se ce l'ha devo accedere ai metodi di A, altrimenti a quelli di B. Mi serve capire se è fattibile o devo cambiare totalmente soluzione
  • Re: Overloading di metodi

    Giuso ha scritto:


    Se invece di fare B extends A facessi B implements interfaccia (la stessa che implemente A) potrei fare ciò che mi serve? In pratica io ho questo oggetto in A che può avere o meno una caratteristica; se ce l'ha devo accedere ai metodi di A, altrimenti a quelli di B. Mi serve capire se è fattibile o devo cambiare totalmente soluzione
    Cerca innanzitutto di spiegare meglio la necessità. Parlare di classi A, B ecc.. dice praticamente nulla. Descrivi bene lo scenario a livello pratico che devi realizzare e allora si potrà vedere: a) se è sensato, b) come implementarlo.

    Comunque con le interfacce è possibile fare in modo che una classe A implementi X mentre B non implementa X (A e B potrebbero avere un supertipo specifico in comune oppure solo Object in senso generale) e poi testare se un oggetto implementa X e quindi poi usarne i metodi.
  • Re: Overloading di metodi

    Ok, spiego meglio. Si tratta dell'implementazione dei grafi. Io ho una classe Graph che estende la relativa interfaccia e al suo interno ho tutti i metodi che riguardano grafi non pesati. Ora io devo aggiungere le implementazioni dei grafi pesati in un classe GraphWeight che:
    1) o estende la classe Graph di quelli non pesati
    2) oppure implementa la stessa interfaccia di Graph.
    Poi in un main ho un prompt virtuale con l'utente dove creo un istanza di Graph e richiamo tutti i metodi che mi servono. Da notare che l'oggetto in Graph ha anch'esso il peso, ma fin'ora è sempre stato impostato a una costante = 1 pertanto i metodi non considerano il peso degli archi.
    Nei metodi nuovi invece dovrò considerarlo. Quindi alla creazione del grafo vengono inseriti X vertici. Quindi io volevo utilizzare lo stesso grafo così inizializzato per inserire archi non pesati (e quindi accedere ai metodi di Graph) o archi PESATi (e quindi accedere ai metodi di GraphWeigth)
    Ora mi serviva capire se conveniva la extends o la implements per fare ciò che mi serve, dato che le direttive del compito dicono questo.
    Penso sia più chiaro adesso?
Devi accedere o registrarti per scrivere nel forum
6 risposte