ฉันเริ่มเขียนโปรแกรมใน 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 ไม่สามารถเป็นสิ่งเหล่านี้ทั้งหมดในเวลาเดียวกัน มันเป็นบริบทยัง polymorphing ด้วยนี้จะไม่ทำงาน (วิธีการกำหนดวิธีการที่ซุปเปอร์ที่จะดำเนินการหรือไม่เรียกตัวสร้างซุปเปอร์คลาสทุกคนไม่ควรเกิดขึ้นที่นี่)
มีแนวคิดหรือข้อเสนอแนะการออกแบบที่ผู้คนเสนอให้หรือไม่? ฉันไม่สามารถพบสิ่งใดใน google ที่เกี่ยวข้องกับการสร้างแบบจำลองความสามัคคีของวรรณยุกต์จากมุมมองของ OO มีความสัมพันธ์มากเกินไประหว่างแนวคิดทั้งหมดที่นี่