Bu genellikle mesajlar kullanılarak yapılır. Bu sitedeki diğer sorularda, burada veya orada olduğu gibi birçok ayrıntı bulabilirsiniz .
Özel örneğinizi yanıtlamak için, gidilecek bir yol Messagenesnelerinizin işleyebileceği küçük bir sınıf tanımlamaktır , örneğin:
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);
}
}
Bu şekilde, Objsınıf arayüzünü bileşenle ilgili yöntemlerle "kirletmezsiniz" . Bazı bileşenler mesajı işlemeyi seçebilir, bazıları bunu görmezden gelebilir.
Bu yöntemi doğrudan başka bir nesneden çağırarak başlayabilirsiniz:
Message msg(obj1, "EmitForce(5.0,0.0,0.0)");
obj2.ProcessMessage(msg);
Bu durumda, obj2'ın Physicsmesajı almak ve işlemek bunu yapması gereken neyse yapacağız. Tamamlandığında, ya:
- Kendine,
Positionbileşenin seçeceği bir "SetPosition" iletisi gönderin ;
- Ya da
Positionmodifikasyonlar için bileşene doğrudan erişin (her nesnenin bir Positionbileşeni olduğunu varsayamayacağınız, ancak Positionbileşenin bir gereksinimi olabilir Physics) saf bileşen tabanlı bir tasarım için oldukça yanlıştır .
İletinin gerçek işlenmesini bir sonraki bileşenin güncelleştirmesine ertelemek genellikle iyi bir fikirdir . Hemen işlenmesi, diğer nesnelerin diğer bileşenlerine mesaj göndermek anlamına gelebilir, bu nedenle sadece bir mesaj göndermek hızla ayrılmaz bir spagetti yığını anlamına gelebilir.
Muhtemelen ileride daha gelişmiş bir sisteme gitmeniz gerekecek: eşzamansız mesaj kuyrukları, nesne grubuna mesaj gönderme, bileşen başına kayıt / mesajlardan kayıt silme vb.
MessageYukarıda gösterilen, ancak zamanında dizeleri işleme gerçekten verimli olmadığı için sınıf basit dize için genel bir kap olabilir. Farklı değer türlerini ayırt etmek için genel değerler içeren bir kapsayıcı için gidebilirsiniz: dizeler, tamsayılar, kayanlar ... Bir ad veya daha iyisi ile bir kimlik. Veya belirli ihtiyaçlara uyacak bir temel sınıf da türetebilirsiniz. Sizin durumunuzda, istenen kuvvet vektöründen EmitForceMessagetüreyen Messageve ekleyen bir hayal edebilirsiniz - ancak bunu yaparsanız RTTI'nin çalışma zamanı maliyetine dikkat edin .