コード、音階、ハーモニーを分析するプログラムをC ++ 11で書き始めました。私が設計段階で抱えている最大の問題は、音「C」が音、コードのタイプ(Cmaj、Cmin、C7など)、およびキーのタイプ(Cmajor、Cminorのキー)であることです。間隔(マイナー3、メジャー3)でも同じ問題が発生します。
私は、プログラム内のすべての「シンボル」の基本クラスである基本クラスであるトークンを使用しています。例えば:
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;
ご覧のとおり、すべての派生クラス(CMajorTriad、C、CMajorScale、CMajorKeyなど)を作成すると、他のすべての音符と調波を含め、途方もなく複雑になります。多重継承は機能しません。つまり:
class C : public Note, Triad, Key, Scale
クラスC、これらすべてを同時に使用することはできません。コンテキストに依存し、これによるポリモーフィングも機能しません(どのスーパーメソッドを実行するかをどのように決定するのですか?すべてのスーパークラスコンストラクターの呼び出しはここでは発生しません)
人々が提供しなければならないデザインのアイデアや提案はありますか?オブジェクト指向の観点から音調の調和をモデリングすることに関して、グーグルで何かを見つけることができませんでした。ここのすべての概念の間には、あまりにも多くの関係があります。