Ho iniziato a scrivere un programma in C ++ 11 per analizzare accordi, scale e armonia. Il problema più grande che ho nella mia fase di progettazione è che la nota "C" è una nota, un tipo di accordo (Cmaj, Cmin, C7, ecc.) E un tipo di chiave (la chiave di Cmajor, Cminor). Lo stesso problema si presenta con intervalli (minore 3, maggiore 3).
Sto usando una classe base, Token, che è la classe base per tutti i 'simboli' nel programma. quindi ad esempio:
class Token {
public:
typedef shared_ptr<Token> pointer_type;
Token() {}
virtual ~Token() {}
};
class Command : public Token {
public:
Command() {}
pointer_type execute();
}
class Note : public Token;
class Triad : public Token; class MajorTriad : public Triad; // CMajorTriad, etc
class Key : public Token; class MinorKey : public Key; // Natural Minor, Harmonic minor,etc
class Scale : public Token;
Come puoi vedere, creare tutte le classi derivate (CMajorTriad, C, CMajorScale, CMajorKey, ecc.) diventerebbe rapidamente ridicolmente complesso includendo tutte le altre note e anche gli enharmonics. l'ereditarietà multipla non funzionerebbe, cioè:
class C : public Note, Triad, Key, Scale
la classe C, non può essere tutte queste cose allo stesso tempo. È contestuale, anche il polimorfo con questo non funzionerà (come determinare quali super metodi eseguire? Chiamare ogni costruttore di super-classe non dovrebbe accadere qui)
Ci sono idee o suggerimenti di design che le persone hanno da offrire? Non sono stato in grado di trovare nulla su google per quanto riguarda la modellazione dell'armonia tonale da una prospettiva OO. Ci sono troppe relazioni tra tutti i concetti qui.