मुझे लगता है कि मैं अपने कोड में किसी चीज़ का केस स्टडी का उपयोग उदाहरण के उदाहरण के रूप में करूँगा।इंटरफ़ेस विरासत/पदानुक्रम .Net में - क्या कोई बेहतर तरीका है?
अभी, मैं अपने घटक-आधारित गेम सिस्टम के लिए एक व्यवहार/क्रिया प्रणाली पर काम कर रहा हूं। GameObjects एक IBehaviorComponent और एक IActionComponent उन्हें संलग्न है, जो वह केवल प्रासंगिक विवरण दर्शाने हो सकता है, निम्नलिखित का पर्दाफाश:
public interface IBehaviorComponent : IBaseComponent
{
IBehavior Behavior { get; }
}
public interface IActionComponent : IBaseComponent
{
IAction Action { get; }
void ExecuteAction(IGameObject target = null);
}
अब, यह अब तक सब ठीक है (कम से कम मेरे लिए!)। लेकिन, जब मैं IActionComponent के कार्यान्वयन को देखता हूं तो परेशानी पैदा होती है।
उदाहरण के लिए, एक साधारण IActionComponent कार्यान्वयन:
public class SimpleActionComponent : IActionComponent
{
public IAction Action { get; protected set; }
public void ExecuteAction(IGameObject target = null)
{
Action.Execute(target);
}
public void Update(float deltaTime) { } //from IBaseComponent
}
लेकिन, चलो कहते हैं कि मैं एक अधिक जटिल IActionComponent कार्यान्वयन कार्यों के लिए एक समय समय पर निष्पादित किया जा करने की अनुमति देता है कि लागू करने के लिए चाहते हैं:
public class TimedActionComponent : IActionComponent
{
public IAction Action { get; protected set; }
public float IdleTime { get; set; }
public float IdleTimeRemaining { get; protected set; }
public void ExecuteAction(IGameObject target = null)
{
IdleTimeRemaining = IdleTime;
}
public void Update(float deltaTime)
{
if (IdleTimeRemaining > 0f)
{
IdleTimeRemaining -= deltaTime;
}
else
{
Action.Execute(target);
}
}
}
और अब, मान लें कि मैं IdleTime का पर्दाफाश करना चाहता हूं ताकि इसे बाहरी प्रभावों से बदला जा सके।
public interface ITimedActionComponent : IActionComponent
{
float IdleTime { get; set; }
float IdleTimeRemaining { get; set; }
}
हालांकि, यहां मुद्दा यह है कि मेरे घटक प्रणाली IBaseComponent से एक स्तर ऊपर से सब कुछ संग्रहीत करता है: पहली बार में मेरे विचार एक नया इंटरफेस बनाने के लिए थे। इसलिए, GameObject के लिए एक्शन घटक को IActionComponent के रूप में पुनर्प्राप्त किया जाता है, जैसा कि, कहता है, एक ITimedActionComponent, या एक IRandomizedActionComponent, या यहां तक कि एक ICrashTheProgramActionComponent भी। मुझे उम्मीद है कि इसके कारण स्पष्ट हैं, क्योंकि मैं किसी भी घटक के लिए GameObject से पूछताछ करने में सक्षम होना चाहता हूं, यह जानने के बिना कि वह मूल प्रकार के घटक (IActionComponent, IRenderableComponent, IPhysicsComponent, आदि) से परे क्या चाहता है,
क्या इसका संचालन करने का एक क्लीनर तरीका है, जो मुझे इन वर्गों में परिभाषित इन गुणों को बेनकाब करने की इजाजत देता है, बिना किसी चीज के प्राप्त किए गए IActionComponent को पुनर्प्राप्त करने के लिए? या यह केवल इसे पूरा करने का एकमात्र/सर्वोत्तम तरीका है। कुछ की तरह:
public void IWantYouToAttackSuperSlow(IGameObject target)
{
//Let's get the action component for the gameobject and test if it's an ITimedActionComponent...
ITimedActionComponent actionComponent = target.GetComponent<IActionComponent>() as ITimedActionComponent;
if (actionComponent != null) //We're okay!
{
actionComponent.IdleTime = int.MaxValue; //Mwhaha
}
}
अभी
मुझे लगता है कि सिर्फ़ इसी में सोच रहा हूँ, लेकिन मैं समझ वहाँ एक पैटर्न लकड़ी है कि मैं से अनभिज्ञ हूँ, या में छिपा है अगर मैं देखना चाहते हैं किसी को भी एक सुझाव दे सकते हैं यदि शुरू करने के लिए इसे पूरा करने का एक बेहतर तरीका है।
धन्यवाद!
मेरे दूसरे सोचा इस तरह के IActionComponentExecutor के रूप में है, जो होगा, अंदर किसी अन्य वस्तु का उपयोग किया गया तय करें कि कार्रवाई कब करें। निष्पादित करें(), लेकिन मुझे लगता है कि मुझे एक गोल-ए-बाउट फैशन में स्क्वायर वन पर वापस लाता है - बाहरी ऑब्जेक्ट्स को तब IActionComponentTimedExecutor को ट्रैक करना होगा (ओह ~ हम gettin 'एंटरप्राइज़- y !) IdleTime बदलने के लिए। – Terminal8
ब्याज से - कार्रवाई के लिए राज्य कॉम्पोनेंट.इडलटाइम किसी प्रकार के जेनेरिक बैग में संग्रहीत है? यदि ऐसा है तो आप अपने बेस इंटरफेस पर 'लागू (बैगडाटा बैग)' और 'स्टोर (बैगडाटा बैग)' विधियां कर सकते हैं। उस ने कहा, आपको कुछ मेटाडेटा-प्रकार सिस्टम पर भी विचार करने की आवश्यकता हो सकती है जिसे आप व्युत्पन्न प्रकारों को जानने की आवश्यकता वाले गुणों के लिए उपयोग कर सकते हैं। 'टाइपडिस्क्रिप्टर' एक तैयार रोल वाला प्रारंभिक बिंदु है जिसका उपयोग संपत्ति ग्रिड इत्यादि जैसी चीजों द्वारा किया जाता है। –
नहीं, वर्तमान में यह नहीं है। मैं अवधारणा से पूरी तरह से परिचित नहीं हूं - क्या कोई संदर्भ है जो आप शायद प्रदान कर सकते हैं? – Terminal8