Devo implementare la stessa interfaccia nella classe derivata?

4

C'è una differenza tra

public class B implements C
public class A extends B implements C    

e

public class B implements C
public class A extends B

È solo un'implementazione ridondante? O ci sono vantaggi per farlo?

Modifica

Fai questa domanda, perché l'ho vista nel pacchetto java.util ad es.

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>

public abstract class AbstractMap<K,V> implements Map<K,V>
    
posta doleris 21.04.2016 - 22:43
fonte

2 risposte

7

Per la maggior parte degli intenti e degli scopi non è necessario implementare un'interfaccia nella classe derivata. Tuttavia c'è una differenza tra i due se si fa il riflesso.

Esempio:

public class InterfaceTest {

    static interface I {
        public void doSomething();
    }

    static class A implements I {
        public void doSomething() {
        }    
    }    

    static class B extends A {   
    }

    public static void main(String[] args) {
        System.out.println(A.class.getInterfaces().length);

        for (Class i:A.class.getInterfaces()) {
            System.out.println(i.getName());
        }

        System.out.println(B.class.getInterfaces().length);

        for (Class i:B.class.getInterfaces()) {
            System.out.println(i.getName());
        }

        B b=new B();

        System.out.println(b instanceof I);
    }
}

Questo produce:

 1 
 InterfaceTest$I 
 0 
 true

Quindi, mentre b è un'istanza di I, ovviamente B.class.getInterfaces() non ne restituisce nessuna. Devi attraversare la gerarchia delle classi per trovare tutte le interfacce implementate.

Un esempio in cui ciò è rilevante è l'utilizzo di AttributeConverters JPA con Hibernate. Un convertitore di attributi deve implementare l'interfaccia AttributeConverter JPA direttamente a questo punto, implementarlo su una classe base non funziona. Anche se questo è segnalato come errore in Hibernate, mostra comunque che ci sono lievi differenze a seconda di dove si implementa l'interfaccia e il caso d'uso.

    
risposta data 22.04.2016 - 19:12
fonte
1

Effettivamente fanno la stessa cosa, quindi in genere devi solo implementare l'interfaccia sulla classe base.

Tuttavia, se la classe derivata avrebbe bisogno di implementare questa interfaccia, indipendentemente dal fatto che la classe base la implementasse, allora non sarebbe male implementarla anche nella classe derivata. In altre parole, se la classe base non dovesse più implementare questa interfaccia, la classe derivata avrebbe ancora bisogno di? Potresti voler commentare perché è implementato anche nella classe derivata.

Sto facendo fatica ad inventare anche un esempio forzato di dove questo potrebbe applicarsi, però. Spiacente, non vengono in mente esempi realistici.

Corretto: Se stai usando Java e queste sono "Interfacce Marker", puoi invece usare "Annotazioni Marker" che non sono ereditate: link

    
risposta data 22.04.2016 - 06:44
fonte

Leggi altre domande sui tag