我已经开始用C ++ 11编写一个程序来分析和弦,音阶和和声。我在设计阶段遇到的最大问题是,音符“ C”是音符,和弦类型(Cmaj,Cmin,C7等)和键类型(Cmajor,Cminor的键)。间隔也会出现相同的问题(小三,大三)。
我使用的是基类Token,它是程序中所有“符号”的基类。因此,例如:
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类不能同时包含所有这些内容。它是上下文相关的,因此多态化将不起作用(如何确定要执行的超级方法?在这里不应该调用每个超类构造函数)
人们需要提供任何设计想法或建议吗?从面向对象的角度来看,我无法在Google上找到任何有关建模音调和谐的信息。这里所有概念之间的关系太多了。