Come ti spiegavo su Discord, il sistema che stai presentando deve essere modellato in modo da risolvere il tuo problema. Se già lo fa, e lo fa in modo accettabile, sei già a posto senza la necessità di dover fare di più.
Premesso questo, voglio comunque raccogliere qui qualche spunto di miglioramento. Bada bene, però, che molti di questi concetti ricadranno nell'overengineering e nel dominio di sviluppo di una libreria/framework (quindi tenderanno a voler risolvere il problema in generale, piuttosto che risolvere il tuo problema specifico).
Prima cosa da notare: il coupling delle classi. Il sistema di attributi dipende strettamente dall'implementazione che si è fatta in Character, cosa che mi fa storcere un po' il naso. A mio avviso sarebbe più opportuno che il sistema di attributi fornisca anche un custom container da includere dove si vuole.
Altro dettaglio: io preferirei un approccio data-driven per la creazione degli attributi, piuttosto che basato sull'ereditarietà. Quindi credo sia da preferire la composition. In questo modo hai una singola classe che può rappresentare ogni attributo al posto di doverne creare decine derivate da quella base.
E puoi anche semplicemente caricare un file che descrive questi attributi e crearli da questi dati.
Puoi anche facilmente introdurre una factory di attributi in modo da poterli manipolare più facilmente.