Tôi đã bắt đầu viết một chương trình trong C ++ 11 để phân tích hợp âm, thang âm và hòa âm. Vấn đề lớn nhất tôi gặp phải trong giai đoạn thiết kế của mình, đó là nốt 'C' là một nốt, một loại hợp âm (Cmaj, Cmin, C7, v.v.) và một loại phím (phím của Cmajor, Cminor). Vấn đề tương tự phát sinh với các khoảng (thứ 3 nhỏ, thứ 3 lớn).
Tôi đang sử dụng một lớp cơ sở, Token, đó là lớp cơ sở cho tất cả các 'biểu tượng' trong chương trình. ví dụ:
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;
Như bạn có thể thấy, để tạo tất cả các lớp dẫn xuất (CMajorTriad, C, CMajorScale, CMajorKey, v.v.) sẽ nhanh chóng trở nên phức tạp một cách lố bịch bao gồm tất cả các ghi chú khác, cũng như tăng cường. nhiều kế thừa sẽ không hoạt động, tức là:
class C : public Note, Triad, Key, Scale
lớp C, không thể là tất cả những điều này cùng một lúc. Đó là ngữ cảnh, cũng là đa hình với điều này sẽ không hoạt động (làm thế nào để xác định siêu phương thức nào để thực hiện? Gọi mọi nhà xây dựng siêu hạng không nên xảy ra ở đây)
Có bất kỳ ý tưởng thiết kế hoặc đề xuất mà mọi người phải cung cấp? Tôi đã không thể tìm thấy bất cứ điều gì trên google liên quan đến việc mô hình hóa sự hài hòa âm sắc từ góc độ OO. Có quá nhiều mối quan hệ giữa tất cả các khái niệm ở đây.