2015-07-28 23 views
8

Supponiamo che io ho due interfacce:Due Interfaccia con lo stesso Nome metodo - attuazione di metodi

interface IOne { 

    public void method(); 

} 

e

interface ITwo { 

    public void method(); 

} 

una classe concreta implementa entrambe le interfacce:

public class A implements IOne, ITwo { 

    public void method(){ 
     //some implementation 
    } 
} 

Le mie domande sono:

  1. La singola implementazione di method() è sufficiente per entrambe le interfacce IOne e ITwo?
  2. Se la risposta di è sì, esiste un modo per ottenere entrambi i metodi in una singola classe? In questo caso non è necessario implementare entrambe le interfacce in una singola classe.
+0

Per (1) - Sì. Non capisco (2). Puoi rendere la domanda un po 'più chiara per favore? – KDM

risposta

2

Per 1, la risposta è . È sufficiente fornire un'implementazione per il metodo nella classe affinché entrambe le interfacce vengano implementate automaticamente.

Per 2, se è necessario disporre di entrambi i metodi, la classe non deve implementare entrambe le interfacce. Tuttavia, c'è un trucco si può usare:

interface IOne { 

    void method(); 
} 

interface ITwo { 

    void method(); 
} 

public class A 
    implements IOne, ITwo { 

    // Anonymous inner class that implements ony IOne 
    private final IOne one = new IOne() { 

     @Override 
     public void method() { 
      System.out.println("IOne"); 
     } 
    }; 

    // Anonymous inner class that implements ony ITwo 
    private final ITwo two = new ITwo() { 

     @Override 
     public void method() { 
      System.out.println("ITwo"); 
     } 
    }; 

    @Override 
    public void method() { 
     System.out.println("A"); 
    } 

    // Method that delegates to IOne 
    public void methodIOne() { 
     this.one.method(); 
    } 

    // Method that delegates to ITwo 
    public void methodITwo() { 
     this.two.method(); 
    } 
} 

codice Testing:

A a = new A(); 
a.method(); // A 
a.methodIOne(); // IOne 
a.methodITwo(); // ITwo 

Classe A non ha bisogno di implementare entrambe le interfacce. In tal caso, non implementare method() su A e mantenere solo le classi interne anonime.

+0

Bel trucco! Grazie – Razib

+0

Qual è il vantaggio delle classi anonime? Questa logica può essere direttamente in 'methodIOne()' e 'methodITwo()'. – jaco0646

+1

@ jaco0646 questo è solo un trucco per avere due diverse implementazioni dello stesso metodo. Sì, la logica potrebbe essere presente in questi metodi, ma non si applicherebbero conflitti alle interfacce. Con la delega a classi interne e permettendo loro di implementare le interfacce, si attenersi a ciò che il metodo dovrebbe fare. Comunque questo è un trucco. Forse il design non è buono se devi fare queste cose. –

2
  1. Sì. Questo metodo verrà chiamato quando si accede alla classe come un'istanza di IOne o ITwo.

  2. No. Il nome di un metodo, il tipo di ritorno e gli argomenti definiscono la firma di un metodo e due metodi all'interno della stessa classe non possono avere la stessa firma. Ciò comporta un errore in fase di compilazione.

    Una soluzione che suggerisco è di utilizzare nomi di metodi diversi per IOne.method e ITwo.method, rendendo così la firma di ogni metodo univoca. Questo ti permetterebbe di definire due metodi unici in una singola classe.

2

fa la singola implementazione del metodo() uno bastano sia per l'interfaccia IOne e ITwo?

Sì. L'implementazione è la stessa per entrambi i metodi abstract.

Se la risposta 1 è sì, esiste un modo per ottenere entrambi il metodo in una singola classe?

No.

4

Se entrambi i metodi hanno la stessa firma, come è il caso nel tuo esempio, una sola applicazione è possibile. In questo caso, non è possibile implementare due versioni del metodo per le due interfacce. Quindi sì, l'esempio sarà sufficiente.

Se la firma è uguale per i due metodi, ma hanno tipi di restituzione diversi, ciò comporterà un errore di compilazione.

Se i due metodi hanno diverse firme, è possibile e devono essere due diverse implementazioni.