No, non lo è.
Principali principi aperti per invocare funzionalità incapsulanti nelle classi. Non dice se l'interfaccia debba essere definita dalla classe base o dall'interfaccia.
"extends is evil" ti dice di preferire l'implementazione di interfacce sull'estensione delle classi base.
Poiché il principio open-closed va bene con entrambi, non sono contrari.
Per quanto riguarda "extends is evil", ci sono diversi motivi per cui viene usata l'ereditarietà e Java non ti permette di distinguerli (C ++ ha un'eredità protetta e privata che aiuta qui):
- Implementazione di un'interfaccia comune per altro codice da utilizzare.
- Riutilizzo della funzionalità di base.
- Comportamento specializzato della classe per lo più generica.
Dovresti utilizzare le interfacce per la prima in modo da non legarti alla gerarchia dell'ereditarietà singola. Questo è il messaggio principale di "extends is evil".
Per il secondo il metodo preferito è la composizione, anche in questo caso non ti leghi alla gerarchia dell'ereditarietà singola.
Ma per i terzi, l'estensione (astratta) della classe base è appropriata. Il tuo esempio cade nel terzo caso.
Nota comunque che la classe base astratta dovrebbe probabilmente ancora implementare un'interfaccia e il codice dovrebbe usarla ogni volta che non ha bisogno della particolare classe base, che è la maggior parte delle volte.
Nota:
evil, adj.: Something you should avoid most of the time, but not something you should avoid all the time. For example, you will end up using these "evil" things whenever they are "the least evil of the evil alternatives." (C++ FAQ)
Questo vale in tutti i casi simili in cui qualcuno chiama una tecnica "cattiva". Ciò non significa che non devi usarlo, mai. Basta sottolineare che esiste un'alternativa preferita.