Una classe dovrebbe implementare esplicitamente l'interfaccia se anche la sua superclasse la implementa?

6

Fornita un'interfaccia

interface I {
    one();
    two();
}

Una classe base astratta che implementa parzialmente I

abstract class A {
    @Override
    void one() {
         //something
    }
}

E infine una sottoclasse di A

class B extends A (implements I) {
     @OVerride
     void two() {
         //something
    }
}

E ora B deve implementare I da quando A ha fatto.

Nella classe B che ho (implementa I ) e la mia domanda è,
è buono lo stile di codifica per menzionare esplicitamente che si implementa I ?
Anche se ciò è implicito dal fatto che stai creando una sottoclasse di A , ciò sta parzialmente implementando I ?

Si noti che questa è una domanda sul buon stile. So che non c'è differenza tra i due approcci, dal punto di vista della lingua.

    
posta Pengtuzi 13.11.2014 - 23:00
fonte

1 risposta

4

Anche se non ho una risposta autorevole, nella mia esperienza dipenderebbe dalla situazione.

Di solito, la ridondanza non è necessaria. Il punto principale qui è la leggibilità, e più breve è in genere migliore. E, come hai già accennato nella domanda, non c'è alcuna differenza funzionale, quindi scrivi quello che meglio si adatta alla logica del modello e renderà più facile la comprensione.

Di tanto in tanto, può essere utile includere l'interfaccia ridondante. Ecco una versione (utilizzando le classi Animal - > Cat ) di una volta l'ho lasciata in:

interface Animal {}
interface DomesticAnimal implements Animal {}

abstract class AbstractMammal implements Animal {}
class ConcreteDolphin extends AbstractMammal {}
abstract class AbstractCat extends AbstractMammal implements Animal {}
class DomesticCat extends AbstractCat implements DomesticAnimal {}
class WildCat extends AbstractCat {}

Un po 'di contesto: in quel particolare caso il mio compito era di implementare alcune nuove funzionalità nelle nuove classi ConcreteDolphin e AbstractMammal e refactificare un bit di codice comune nella classe astratta.

Tuttavia, il mio team era già abituato a lavorare con Animal s e AbstractMammal s era ancora un concetto abbastanza nuovo. Dopo tutto, tutti sanno che un Cat deve essere un Animal ; cos'era questa AbstractMammal assurdità?!

Quindi in questo caso ho pensato che fosse meglio lasciare il ridondante AbstractCat extends AbstractMammal implements Animal in quanto rendeva più facile la lettura. Direi che si tratta di un caso raro , tuttavia, la maggior parte delle volte sarebbe più pulito avere solo quello.

    
risposta data 14.11.2014 - 00:44
fonte

Leggi altre domande sui tag