2014-08-31 29 views
11

Mi dispiace davvero non sapevo come titolo la questione, ecco il problema ...stesso metodo per più classi che implementano la stessa interfaccia

Ho un'interfaccia e classi multiple che implementano l'interfaccia. L'implementazione di alcuni dei metodi nell'interfaccia è esattamente la stessa in ogni classe di implementazione. Mi sembra che ci dovrebbe essere un modo per semplificare questo, quindi non devo scrivere lo stesso codice ogni volta. Esempio:

public interface Foo { 
    String getName(); 
} 

public class FooImpl1 implements Foo { 
    private String name = "foo name1"; 

    public String getName() { 
     return name; 
    } 
} 

public class FooImpl2 implements Foo { 
    private String name = "foo name2"; 

    public String getName() { 
     return name; 
    } 
} 

Quindi, per abbattere ..

  1. c'è un modo per mettere il codice per getName in un posto e ogni classe ha il proprio nome variabile?

  2. c'è un modo per fare getName statica in modo da non dover creare una nuova istanza

avere idee migliori?

+8

È possibile definire una classe astratta che è il padre di quei due e che contiene il campo nome e il metodo per ottenere il nome. Le lezioni per bambini non dovranno implementarla. –

risposta

11

Utilizzare una classe astratta e inizializzare il campo nel costruttore:

public abstract class Foo { 

protected String name; 

String getName() { 
    return name; 
} 
} 

public class FooImpl1 extends Foo { 

public FooImpl1() { 
    name = "foo name1"; 
} 
} 

public class FooImpl2 extends Foo { 

public FooImpl1() { 
    name = "foo name2"; 
} 
} 

JB Nizlet rilevare che sarebbe stato più pulito di fare qualcosa di simile:

public abstract class Foo { 

protected String name; 

public Foo(String newName) { 
    name = newName; 
} 

String getName() { 
    return name; 
} 
} 

e quindi chiamare super("foo name 1") nel sottoclassi.

Come @Peter Lawrey detto, se si dispone già di un'interfaccia o volete uno per qualche altro motivo:

public interface IFoo { 
String getName(); 
} 

public abstract class Foo implements IFoo { 

protected String name; 

String getName() { 
    return name; 
} 
} 
+2

+1 Se è necessaria un'interfaccia, la classe astratta può implementare l'interfaccia. –

+0

Sarebbe più pulito prendere il nome nel costruttore della superclasse e chiamare 'super (nome)' –

+0

@JBNizet Sì, lo modificherà. –

1

si poteva prendere un approccio molto semplice:

public interface Foo { 

    String getName(); 
} 

public class Named implements Foo { 

    String name; 

    public String getName() { 
     return name; 
    } 
} 

public class FooImpl1 extends Named { 
    {name = "foo name1";} 
} 

public class FooImpl2 extends Named { 
    {name = "foo name2";} 
} 
+0

È valido Java? –

+0

@AnubianNoob - Supponendo che stai parlando delle parti '{name = ...}', quelle sono [blocchi di inizializzazione] (http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html).In un'altra nota, trovo sempre inutili le domande/i commenti che chiedono "questo è valido" perché di solito è sufficiente eseguire il codice attraverso un compilatore/interprete con la stessa facilità con cui chiedere se è valido, e si ottiene una risposta immediata. – DaoWen

+0

Beh, so che è valido. Quello che sto chiedendo è come si chiama (grazie) e forse anche un link (grazie mille). –

0

Non funziona davvero per getter come nel tuo esempio, ma poiché la domanda è più generica, penso che valga la pena ricordare che con Java 8 è possibile definire default methods in interfaces. Quindi, se si ha qualcosa di un po 'più complesso come:

public interface ComplexFoo { 
    String getFirstName(); 
    String getLastName(); 

    String getFullName(); 
} 

Non è necessario ripetere la getFullName implementazione in ogni sottoclasse, ma possibile specificare nell'interfaccia:

public interface ComplexFoo { 
    String getFirstName(); 
    String getLastName(); 

    default String getFullName() { 
     return getFirstName() + " " + getLastName(); 
    } 
} 

i getter anche se ancora bisogno di ripetere, dal momento che accedono membri che non sono ancora disponibili nell'interfaccia:

public class FooImpl1 implements ComplexFoo { 
    private String firstName = "foo"; 
    private String lastName = "name1; 

    private String getFirstName() { return firstName; } 
    private String getLastName() { return lastName; } 
} 

public class FooImpl2 implements ComplexFoo { 
    private String firstName = "foo"; 
    private String lastName = "name2; 

    private String getFirstName() { return firstName; } 
    private String getLastName() { return lastName; } 
} 
Problemi correlati