Se una classe estende un genitore che definisce un'interfaccia, tale classe dovrebbe anche implementare esplicitamente l'interfaccia?
Ad esempio, è meglio includere o rimuovere la parte tra parentesi quadre sotto:
interface IVerbable {}
abstract class BaseVerber implements IVerbable {}
class Verber extends BaseVerber [implements IVerbable] {}
Dal punto di vista funzionale, non vi è alcuna differenza nell'implementazione forzata, poiché Verber
"è-un" IVerbable
in virtù della sua parentela, anche se non implementa esplicitamente l'interfaccia stessa:
var_dump(new Verber() instanceof IVerbable); // bool(true)
Non funzionalmente, sembrano esserci due vantaggi all'implementazione in entrambi i posti:
- Una persona che legge il codice sa immediatamente che implementa l'interfaccia, senza dover visualizzare la definizione del genitore.
- In secondo luogo, PhpDocumentor non segue la traccia se la classe astratta non fornisce un'implementazione predefinita dell'interfaccia. L'implementazione concreta non erediterebbe la documentazione a meno che non implementasse esplicitamente l'interfaccia, o l'abstract fornisse un'implementazione, anche una vuota.
Suppongo che potrebbe essere una cattiva pratica omettere i metodi implementati dalla classe astratta. Probabilmente è meglio mostrare almeno la firma vuota, ma poi stai anche duplicando la firma vuota sia nell'interfaccia che nella classe astratta.