Le gerarchie di ereditarietà rappresentano relazioni "is-a" - un oggetto in realtà è un altro oggetto.
Questo non è ciò che i tag rappresentano. Le categorie in un negozio non rappresentano: una relazione, è più di un "appartiene a" o, in termini di programmazione, "supporta la caratteristica xy". I tag possono cambiare , possono essere aggiunti e rimossi perché tu ne hai bisogno - le classi base non possono, poiché l'oggetto ha bisogno di esso! Gli oggetti non dipendono dai tag che tu gli dai, ma dipendono dalle loro classi base per avere un senso.
Puoi mettere un auto nella categoria "auto verdi" o "auto degli anni '60" - nessun problema, non importa - ma non può mai smettere di essere un veicolo!
Quindi, come vedi, gli alberi ereditari ei tuoi tag modellano cose completamente diverse . Uno riguarda l'oggetto stesso, l'altro su come relazioniamo gli oggetti insieme.
È vero, ci sono casi in cui ha senso che un oggetto abbia più di una classe base, ma questi sono rari e poiché supportare l'ereditarietà multipla vera causa molti altri problemi (ecco perché molte lingue OO non lo consentono), è un il modo ragionevole per modellare è-una gerarchia attraverso gli alberi.
D'altra parte, i tuoi tag sono rappresentati tramite interfacce (per cui l'implementazione di più è consentita praticamente in ogni lingua OO che conosco) - o meglio - attraverso typeclass , che può essere aggiunto o nascosto a seconda delle esigenze.
Sono d'accordo con te sul fatto che l'ereditarietà è spesso abusata in luoghi in cui le interfacce si adattano meglio, ma poiché entrambi sono in linea di principio concetti ortogonali, entrambi hanno i loro casi d'uso appropriati.
Modifica :
Sottolineo ancora typeclasses o concepts as sono probabilmente la risposta che stavi cercando, sebbene la domanda funzioni sulla falsa premessa secondo cui i tag devono sostituire l'ereditarietà.