Ich habe begonnen, ein Programm in C ++ 11 zu schreiben, das Akkorde, Tonleitern und Harmonien analysiert. Das größte Problem, das ich in meiner Entwurfsphase habe, ist, dass die Note 'C' eine Note, eine Akkordart (Cmaj, Cmin, C7 usw.) und eine Tonart (die Tonart von Cmajor, Cminor) ist. Das gleiche Problem tritt mit Intervallen (Moll 3, Dur 3) auf.
Ich benutze eine Basisklasse, Token, das ist die Basisklasse für alle 'Symbole' im Programm. so zum Beispiel:
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;
Wie Sie sehen, würde das Erstellen aller abgeleiteten Klassen (CMajorTriad, C, CMajorScale, CMajorKey usw.) einschließlich aller anderen Noten und Enharmonics schnell lächerlich komplex werden. Mehrfachvererbung würde nicht funktionieren, dh:
class C : public Note, Triad, Key, Scale
Klasse C kann nicht alles gleichzeitig sein. Es ist kontextabhängig, auch Polymorphing wird damit nicht funktionieren (wie man bestimmt, welche Supermethoden auszuführen sind? Aufrufen aller Superklassenkonstruktoren sollte hier nicht passieren).
Gibt es irgendwelche Designideen oder Vorschläge, die die Leute zu bieten haben? In Bezug auf die Modellierung der tonalen Harmonie aus einer OO-Perspektive konnte ich bei Google nichts finden. Es gibt einfach viel zu viele Beziehungen zwischen allen Konzepten.