Quiz Interface

di il
10 risposte

Quiz Interface

Ciao ragazzi , sto svolgendo un quiz per esercitazione personale su java , sulle interface per la precisione , potreste aiutarmi a ripsondere a questa domanda spiegandomi il perchè ?

Assumendo di aver definito un'interface MyInterface e una classe MyClass che la implementa, dire quale delle due istruzioni indicate è corretta per completare la parte indicata dai puntini nel seguente codice.

 public static void metodo(MyInterface mi){
 ...
 // resto del metodo irrilevante
 }
A. MyInterface mc=mi;
B. MyClass mc=mi;

L'istruzione B.

 Né A. né B. 

Sia A. che B. 

L'istruzione A.

Spero possiate aiutarmi , è un'argomento che mi è risultato difficile.

10 Risposte

  • Re: Quiz Interface

    Tu che risposta daresti?

    PS: sei sicuro che il resto del metodo sia irrilevante ai fini della risposta?

    Le interface sono un argomento certamente “ostico” per chi ci si avvicina per la prima volta, ma è anche un argomento fondamentale per arrivare a comprendere appieno la potenza del polimorfismo.

  • Re: Quiz Interface

    Il metodo restante è irrilevante, lo dice proprio l'esercizio, io sarei più per la risposta Nè A nè B , in quanto so che l'interface non si può inizializzare, che sarebbe la A, mentre il secondo caso lo escluderei in quanto si può  fare al massimo  il contrario , visto che è MyClass che implementa MyInterface, può essere giusto?

  • Re: Quiz Interface

    No.

    L'istruzione A è certamente valida e possibile poichè si tratta di un'assegnazione tra due oggetti dello stesso tipo.

    L'istruzione B non è fattibile poichè richiede un downcast esplicito che manca.

    Non confondere l'istanziazione con l'assegnazione, sono due cose diverse.

    L'istanziazione si ha quando si usa l'istuzione “new”. Istanziare un'interface non è fattibile per ovvi motivi. L'assegnazione, invece, non istanzia proprio nulla: semplicemente fa puntare entrambe le variabili allo stesso oggetto e se non ci sono problemi di incompatibilità di tipi è ovviamente possibile.

    Se il parametro del metodo fosse stato di tipo MyClass allora entrambe le istruzioni sarebbero state valide: la prima è un upcast (che è sempre possibile), mentre la seconda sarebbe un'assegnazione tra due oggetti dello stesso tipo.

  • Re: Quiz Interface

    Bene ho capito , grazie mille SpiritoLibero , avrei altri quesiti sulle interface , sempre con gli esercizi , vorrei proporli per avere un'ulteriore chiarimento.

  • Re: Quiz Interface

     Si supponga di aver definito una Interface UnInterface in cui è definito un metodo unMetodo() e una classe UnaClasse che estende l'Interface e, oltre al metodo dell'interface definisce un metodo unAltroMetodo(). Dire quale delle seguenti coppie di istruzioni è corretta: 

    A) UnInterface u=new UnInterface();
     u.unMetodo(); 
    B) UnInterface u=new UnaClasse(); 
    u.unAltroMetodo();

    Risposte:

    1)A

    2)B

    3)Nè la A nè la B

    4)Sia la A che la B

    In questo caso penso che la risposta sia la 3) , in quanto nella A non posso inizializzare l'Interface, mentre nella B ,  la prima riga di codice va bene , ma la seconda a parere mio no , in quanto u, essendo di tipo Interface, non può utilizzare il metodo unAltroMetodo(), che può essere utilizzato solo da oggetti di tipo UnaClasse, mentre il metodo unMetodo() sarebbe andato bene, giusto?

  • Re: Quiz Interface

    Questo è un'altro:

    Si considerino un'Interface MiaInterfaccia ed una classe MiaClasse definite come segue:

    interface MiaInterfaccia{
    public double metodoA(MiaInterfaccia mi1,MiaInterfaccia mi2);
    }
    public class MiaClasse implements MiaInterfaccia{
    public MiaClasse(){…}
    public double metodoA(MiaInterfaccia mi1,MiaInterfaccia mi2){…}
    public double metodo B(MiaClasse mc1,MiaClasse mc2){…}
    }

    Dire quale frammento di codice è corretto:

    Le altre risposte ho capito che non erano corrette , ma non mi torna qualcosa su questa,che è quella giusta:

    MiaInterfaccia mi=new MiaClasse();
    MiaClasse mc=new MiaClasse();
    mi.metodoA(mi,mc);

    Il mio dubbio è sull'ultima riga:il metodoA dovrebbe ricevere come parametro due interface , come mai  se gli passo un 'oggetto di tipo MiaClasse(mc) va bene ?

  • Re: Quiz Interface

    06/06/2023 - biagio-23 ha scritto:


     Si supponga di aver definito una Interface UnInterface in cui è definito un metodo unMetodo() e una classe UnaClasse che estende l'Interface e, oltre al metodo dell'interface definisce un metodo unAltroMetodo(). Dire quale delle seguenti coppie di istruzioni è corretta: 

    A) UnInterface u=new UnInterface();
     u.unMetodo(); 
    B) UnInterface u=new UnaClasse(); 
    u.unAltroMetodo();

    Risposte:

    1)A

    2)B

    3)Nè la A nè la B

    4)Sia la A che la B

    In questo caso penso che la risposta sia la 3) , in quanto nella A non posso inizializzare l'Interface, mentre nella B ,  la prima riga di codice va bene , ma la seconda a parere mio no , in quanto u, essendo di tipo Interface, non può utilizzare il metodo unAltroMetodo(), che può essere utilizzato solo da oggetti di tipo UnaClasse, mentre il metodo unMetodo() sarebbe andato bene, giusto?

    Corretto.

    Chi ha scritto la consegna dovrebbe essere bacchettato perchè una classe non può “estendere” un'interfaccia, ma la può “implementare”.

  • Re: Quiz Interface

    06/06/2023 - biagio-23 ha scritto:


    Il mio dubbio è sull'ultima riga:il metodoA dovrebbe ricevere come parametro due interface , come mai  se gli passo un 'oggetto di tipo MiaClasse(mc) va bene ?

    Per l'ereditarietà.

    Se ho un oggetto X di classe A (che implementa un'interfaccia B) allora l'oggetto è sia di tipo A che di tipo B.

    Quindi io posso utilizzare X ovunque sia richiesto un oggetto di tipo A (banale) o di tipo B (per ereditarietà: posso risalire tranquillamente l'albero genealogico).

  • Re: Quiz Interface

    Capisco ,grazie mille , un'ultima curiosità:

    il metodo metodoA può essere chiamato anche da un'oggetto di tipo MiaClasse?

    Mentre il metodoB può essere chiamato solo da MiaClasse giusto ?

  • Re: Quiz Interface

    06/06/2023 - biagio-23 ha scritto:


    il metodo metodoA può essere chiamato anche da un'oggetto di tipo MiaClasse?

    Ovviamente. Dato che lo implementa, fa parte del suo “corredo”.

    06/06/2023 - biagio-23 ha scritto:


    Mentre il metodoB può essere chiamato solo da MiaClasse giusto ?

    Sì.

Devi accedere o registrarti per scrivere nel forum
10 risposte