Ho iniziato a scrivere un programma in C ++ 11 che analizzasse accordi, scale e armonia. Il problema più grande che sto riscontrando 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 pone con intervalli (3 ° minore, 3 ° maggiore).
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, comprese tutte le altre note, così come gli enharmonics. l'ereditarietà multipla non funzionerebbe, ovvero:
class C : public Note, Triad, Key, Scale
classe C, non possono essere tutte queste cose contemporaneamente. È contestuale, anche il polimorfismo con questo non funzionerà (come determinare quali super metodi eseguire? Chiamare tutti i costruttori di superclasse 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 fin troppe relazioni tra tutti i concetti qui.