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 Message
nesnelerinizin 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, Obj
sı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 Physics
mesajı almak ve işlemek bunu yapması gereken neyse yapacağız. Tamamlandığında, ya:
- Kendine,
Position
bileşenin seçeceği bir "SetPosition" iletisi gönderin ;
- Ya da
Position
modifikasyonlar için bileşene doğrudan erişin (her nesnenin bir Position
bileşeni olduğunu varsayamayacağınız, ancak Position
bileş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.
Message
Yukarı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 EmitForceMessage
türeyen Message
ve ekleyen bir hayal edebilirsiniz - ancak bunu yaparsanız RTTI'nin çalışma zamanı maliyetine dikkat edin .