यह आमतौर पर संदेशों का उपयोग करके किया जाता है। आप इस साइट पर अन्य प्रश्नों के बहुत सारे विवरण पा सकते हैं, जैसे यहाँ या वहाँ ।
अपने विशिष्ट उदाहरण का उत्तर देने के लिए, जाने का एक तरीका एक छोटी Message
कक्षा को परिभाषित करना है जिसे आपकी वस्तुएं संसाधित कर सकती हैं, जैसे:
struct Message
{
Message(const Objt& sender, const std::string& msg)
: m_sender(&sender)
, m_msg(msg) {}
const Obj* m_sender;
std::string m_msg;
};
void Obj::Process(const Message& msg)
{
for (int i=0; i<m_components.size(); ++i)
{
// let components do some stuff with msg
m_components[i].Process(msg);
}
}
इस तरह आप Obj
घटक से संबंधित विधियों के साथ क्लास इंटरफ़ेस "प्रदूषणकारी" नहीं हैं । कुछ घटक संदेश को संसाधित करना चुन सकते हैं, कुछ इसे अनदेखा कर सकते हैं।
आप इस विधि को सीधे किसी अन्य ऑब्जेक्ट से कॉल करके शुरू कर सकते हैं:
Message msg(obj1, "EmitForce(5.0,0.0,0.0)");
obj2.ProcessMessage(msg);
इस मामले में, obj2
के Physics
संदेश लेने, और जो प्रसंस्करण यह करने की जरूरत है क्या करेंगे। जब किया, यह या तो होगा:
- स्वयं को "सेटपोजिशन" संदेश भेजें, जो
Position
घटक उठाएगा ;
- या सीधे
Position
संशोधनों के लिए घटक का उपयोग करें (शुद्ध घटक-आधारित डिज़ाइन के लिए काफी गलत है, क्योंकि आप यह नहीं मान सकते हैं कि प्रत्येक वस्तु में एक Position
घटक है, लेकिन Position
घटक एक आवश्यकता हो सकती है Physics
)।
यह आम तौर पर अगले घटक के अद्यतन के लिए संदेश के वास्तविक प्रसंस्करण में देरी करने के लिए एक अच्छा विचार है । इसे तुरंत संसाधित करने का मतलब अन्य वस्तुओं के अन्य घटकों को संदेश भेजना हो सकता है, इसलिए केवल एक संदेश भेजने का मतलब एक निष्क्रिय स्पेगेटी स्टैक हो सकता है।
आपको शायद बाद में और अधिक उन्नत प्रणाली के लिए जाना होगा: अतुल्यकालिक संदेश कतार, वस्तुओं के समूह को संदेश भेजना, प्रति-घटक पंजीकरण / संदेशों से अपंजीकृत करना आदि।
Message
जैसा कि ऊपर दिखाया, लेकिन क्रम में प्रसंस्करण तार वास्तव में कुशल नहीं है वर्ग एक सरल स्ट्रिंग के लिए एक सामान्य कंटेनर हो सकता है। आप सामान्य मूल्यों के एक कंटेनर के लिए जा सकते हैं: तार, पूर्णांक, फ़्लोट्स ... एक नाम या बेहतर अभी तक, एक आईडी के साथ, विभिन्न प्रकार के संदेशों को अलग करने के लिए। या आप विशिष्ट आवश्यकताओं को पूरा करने के लिए एक बेस क्लास भी प्राप्त कर सकते हैं। यदि आप ऐसा करते हैं, तो आपके मामले में, आप एक कल्पना कर सकते हैं और वांछित बल वेक्टर-बटू को आरटीटीआई की रनटाइम लागत EmitForceMessage
से Message
जोड़ सकते हैं।