In genere ho affrontato problemi di manutenzione molto, molto più associati alle interfacce pure rispetto agli ABC, anche agli ABC usati 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, quanto è utile per le interfacce pure completamente prive di funzionalità e stato? Se uso USB come esempio, questa è un'interfaccia ragionevolmente stabile (penso che ora siamo su USB 3.2, ma ha anche mantenuto la compatibilità con le versioni precedenti).
Eppure 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 è quella che si inserisce nella porta come unica parte sostituibile.
Altrimenti sarebbe solo un "buco" nel tuo computer con un fattore di forma standardizzato e requisiti funzionali molto più ampi che non farebbero nulla da solo fino a quando ogni produttore non si inventasse 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 per come farlo. Nel frattempo potremmo finire con 200 modi diversi di farlo dopo che tutti i produttori di hardware hanno cercato di escogitare i propri modi per collegare funzionalità e affermare quel "buco".
E a quel punto potremmo avere alcuni produttori che presentano problemi diversi rispetto ad altri. Se avessimo bisogno di aggiornare le specifiche, potremmo avere 200 diverse implementazioni di porte USB concrete con modi totalmente diversi di affrontare le specifiche che devono essere aggiornate e testate. Alcuni produttori potrebbero sviluppare implementazioni standard di fatto che condividono tra loro (la tua 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 utilizzare più energia della batteria rispetto ad altri. Alcuni potrebbero sfaldarsi e non funzionare con tutto l'hardware che dovrebbe funzionare con le porte USB. Alcuni potrebbero richiedere che un reattore nucleare sia collegato per funzionare, che tende a provocare avvelenamenti da radiazioni.
Ed è quello che ho trovato, personalmente, con interfacce pure. Potrebbero esserci alcuni casi in cui hanno senso, come solo modellare il fattore di forma di una scheda madre rispetto a un case della CPU. Le analogie dei fattori di forma sono, in effetti, praticamente apolidi e prive di funzionalità, come nel caso del "buco" analogico. Ma spesso considero un enorme errore per i team ritenerlo in qualche modo superiore in tutti i casi, nemmeno vicino.
Al contrario, penso che molti più casi sarebbero risolti meglio dagli ABC che dalle interfacce se queste fossero le due scelte a meno che il tuo team non sia così gigantesco che in realtà è desiderabile avere l'equivalente sopra equivalente di 200 implementazioni USB concorrenti piuttosto che uno standard centrale per mantenere. In un ex team in cui mi trovavo, in realtà ho dovuto lottare duramente solo per allentare lo standard di codifica per consentire ABC e eredità multipla, e principalmente in risposta a questi problemi di manutenzione descritti sopra.