2015-11-17 17 views
6

Ho due classi che implementano un'interfaccia particolare. Vorrei implementare un metodo che sarebbe condiviso dalle 2 classi. Posso aggiungere l'implementazione del metodo alla classe di interfaccia e quindi effettuare una chiamata a tale metodo dalle 2 classi.Implementazione del metodo di interfaccia comune in java

Per esempio:

public interface DM 
{ 
    public static void doSomething() { 
     System.out.println("Hello World");} 
    } 

    public class A implements DM 
    { 
     doSomething(); 
    } 

    public class B implements DM 
    { 
     doSomething(); 
    } 
} 

È questo fattibile? Qual è il modo corretto di fare questo

Grazie

risposta

4

Sì, se si utilizza Java 8, è possibile creare un'implementazione default, in questo modo:

public interface DM 
{ 
    default void doSomething() { System.out.println("Hello World");} 
} 

o , se deve essere statico:

public interface DM 
{ 
    static void doSomething() { System.out.println("Hello World");} 
} 

Per ulteriori informazioni, vedere Oracle's documentation on the feature

Un'altra strategia che è possibile utilizzare, se si è in grado di apportare modifiche più estese al codice, è quella di utilizzare uno abstract class anziché un'interfaccia e utilizzare invece le classi di implementazione extend. Qualsiasi metodo nell'interfaccia per cui non si desidera scrivere valori predefiniti deve essere contrassegnato come abstract.

public abstract class DM 
{ 
    public void doSomething() { System.out.println("Hello World");} 
    public abstract void doSomethingElse(); 
} 

public class A extends DM 
{ 
    doSomething(); 
} 

Si potrebbe anche combinare gli approcci, se si desidera utilizzare le interfacce, ma non può/non utilizzerà le impostazioni predefinite:

public abstract class DMImpl impelements DM 
{ 
    @Override   
    public void doSomething() { System.out.println("Hello World");} 
} 

public class A extends DM 
{ 
    doSomething(); 
} 
+2

Un modello più approfondita è iniziare con l'interfaccia 'DM' interfaccia pubblica - creare una classe base astratta con comuni/shared/implementazioni predefinite' classe astratta pubblica AbstractBaseDM implementa DM', quindi estendere che 'public class A estende AbstractBaseDM' e 'public class B estende AbstractBaseDM' (comunque con Java 8 userò _default_ per molti di questi casi) –

+0

@StephenP Questo è un buon punto, vorrei un dd alla mia risposta. –

0

Prima di tutto, è interfacenon una classe. Poi, sì, con Java 8 di default methods, è possibile aggiungere definizioni dei metodi di interfacce,

3

È possibile creare un metodo default con Java 8. Ha un po ' limitazioni ma buone per alcune funzionalità comunemente condivise.

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

interface DM { 

    default public void doSomething() { 
     System.out.println("Hi"); 
    } 

} 
+1

Funzionerà - sebbene si noti che i metodi predefiniti per le interfacce sono in realtà intesi a garantire che tutte le classi di implementazione non si interrompano quando un nuovo metodo viene aggiunto a un'interfaccia. Se hai davvero bisogno di un metodo comune per due o più classi, considera una classe astratta o Composizione. – TR1

0

si può provare questo

interface DM 
{ 
    public void doSomething(); 
} 

class A implements DM 
    { 
     public void doSomething() 
     { 
      System.out.println("Hello World"); 
     } 
    } 

class B implements DM 
    { 
     public void doSomething() 
     { 
      System.out.println("Hello World"); 
     } 
    } 
class Test111 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("Hello"); 
    } 
} 
Problemi correlati