In genere ho affrontato problemi di manutenzione di gran lunga superiori a quelli delle interfacce pure rispetto agli ABC, persino agli ABC utilizzati con ereditarietà multipla. YMMV: non so, forse il nostro team li ha usati in modo inadeguato.
Detto questo, se usiamo un'analogia del mondo reale, quanta utilità c'è per le pure interfacce completamente prive di funzionalità e stato? Se uso l'USB come esempio, si tratta di un'interfaccia ragionevolmente stabile (penso che ora siamo a USB 3.2, ma ha anche mantenuto la compatibilità con le versioni precedenti).
Tuttavia non è un'interfaccia senza stato. Non è privo di funzionalità. È più simile a una classe base astratta che a un'interfaccia pura. In realtà è più vicino a una classe concreta con requisiti funzionali e di stato molto specifici, con l'unica astrazione che è ciò che si connette alla porta essendo l'unica parte sostituibile.
Altrimenti sarebbe solo un "buco" nel tuo computer con un fattore di forma standardizzato e requisiti funzionali molto più sciolti che non farebbero nulla da solo fino a quando ogni produttore non ha creato il proprio hardware per fare quel buco fare qualcosa, a quel punto diventa uno standard molto più debole e nient'altro che un "buco" e una specifica di cosa dovrebbe fare, ma nessuna disposizione centrale su come farlo. Nel frattempo potremmo finire con 200 modi diversi di farlo dopo che tutti i produttori di hardware cercheranno di inventare i propri modi per collegare funzionalità e stato a quel "buco".
E a quel punto potremmo avere determinati produttori che introducono diversi problemi rispetto ad altri. Se abbiamo bisogno di aggiornare le specifiche potremmo avere 200 diverse implementazioni concrete di porte USB con modi completamente diversi di affrontare le specifiche che devono essere aggiornate e testate. Alcuni produttori potrebbero sviluppare di fatto implementazioni standard che condividono tra loro (la classe di base analogica che implementa tale interfaccia), ma non tutti. Alcune versioni potrebbero essere più lente di altre. Alcuni potrebbero avere un rendimento migliore ma una latenza peggiore o viceversa. Alcuni potrebbero usare più energia della batteria di altri. Alcuni potrebbero sfaldarsi e non funzionare con tutto l'hardware che dovrebbe funzionare con le porte USB. Alcuni potrebbero richiedere l'installazione di un reattore nucleare per funzionare che ha la tendenza a dare ai suoi utenti un avvelenamento da radiazioni.
E questo è quello che ho trovato, personalmente, con interfacce pure. Ci possono essere alcuni casi in cui hanno senso, come solo per modellare il fattore di forma di una scheda madre rispetto a un caso di CPU. Le analogie dei fattori di forma sono, infatti, praticamente prive di status e prive di funzionalità, come nel caso del "buco" analogico. Ma considero spesso un grosso errore per i team considerarlo in qualche modo superiore in tutti i casi, nemmeno vicino.
Al contrario, penso che molti casi sarebbero meglio risolti dagli ABC rispetto alle interfacce se queste sono le due scelte a meno che la tua squadra non sia così gigantesca che è effettivamente desiderabile avere l'equivalente analogico sopra di 200 implementazioni USB concorrenti piuttosto che una standard centrale da mantenere. In una ex squadra in cui mi trovavo, ho dovuto lottare duramente solo per sciogliere lo standard di codifica per consentire l'ABC e l'ereditarietà multipla, e principalmente in risposta a questi problemi di manutenzione sopra descritti.