बेस क्लास के प्रत्येक बच्चे के लिए एक स्थिर चर बनाना और इसे प्राप्त करना

मेरे पास एक अमूर्त प्रबंधक वर्ग 'प्रबंधकबेस' है जिसे मैं प्राप्त करना चाहता हूं और इसमें से कई बच्चे हैं जिनके पास सभी स्थिर संदर्भ हैं।

public abstract class ManagerBase : MonoBehaviour {

public static T SharedInstance = default(T);
static bool _sharedInstanceSet = false;

/// 
/// Awake this instance, assigning the shared instance. Important this awake function gets called for each derived class ///
 
protected virtual void Awake() {

    if (_sharedInstanceSet != false) {

        if (BaseManagerVars.ShouldOverwritePrevious == true) {
            Toolbox.GetTools.DestroyObject(SharedInstance.gameObject); //ERROR T does not contain definition of 'gameObject' (FYI is a variable in MonoBehaviour)
        }

        else {

            Toolbox.GetTools.DestroyObject(this.gameObject);
            Debug.Log("Duplicate manager " + this.gameObject.name + " will be deleted");
            return;
        }
    }
    SharedInstance = this;   //ERROR Cannot convert type ManagerBase to T
    _sharedInstanceSet = true;
}

इस तरह

public class EventMessageManager : ManagerBase  {

}

आदर्श रूप से मैं विरासत चर 'SharedInstance' का उपयोग कर 'EventMessageManager' के साझा उदाहरण तक पहुंचने में सक्षम होना चाहता हूं

पसंद

EventMessageManager.SharedInstance.whatever();

मैं इस कार्यक्षमता को पाने के बारे में कैसे जा सकता हूं? आप देख सकते हैं कि मैंने बेस मैनेजर क्लास में संकलन त्रुटियों में टिप्पणी की है।

I was originally using a static variable in the 'MangerBase' इस तरह

public static ManagerBase SharedInstance

लेकिन बच्चों के स्थिर संदर्भ प्राप्त करने के लिए बहुत लंबा था और साफ दिखने के रूप में नहीं

EventMessageManager manager = EventMessageManager.SharedInstance as EventMessageManager;

अग्रिम में धन्यवाद

3
यदि आप अपनी SharedInstance परिभाषा को सार्वजनिक स्थैतिक प्रबंधकबेस SharedInstance = डिफ़ॉल्ट (प्रबंधकबेस <�टी>) के रूप में बदलते हैं, तो आपकी सभी समस्या हल हो जाती है; लेकिन मुझे यकीन नहीं है कि कितना यह आपकी मदद कर सकता है। या हो सकता है कि आपको T से ManagerBase से एक इम्प्लेक्ट रूपांतरण ऑपरेटर लिखने की आवश्यकता हो
जोड़ा लेखक nawfal, स्रोत
यह मानते हुए कि स्थैतिक क्षेत्रों का उपयोग शुरुआत से एक अच्छा विचार है। "साझा इन्स्टेंस = नया टी;" आज़माएं बजाय। काम करने के लिए आपको जेनेरिक पैरामीटर पर एक नई() - बाधा लागू करनी होगी।
जोड़ा लेखक Emil Lundin, स्रोत

2 उत्तर

मुझे यकीन नहीं है कि आप ऐसा पैटर्न क्यों करना चाहते हैं (कुछ अतिरिक्त जानकारी मदद कर सकती है), लेकिन निम्नलिखित कार्य करना चाहिए:

public abstract class ManagerBase : MonoBehaviour where T : ManagerBase

तथा

SharedInstance = this as T;
2
जोड़ा
एक आकर्षण की तरह काम करता है, धन्यवाद।
जोड़ा लेखक user2229618, स्रोत

आप एक विधि getSharedInstance() बना सकते हैं जो एक शब्दकोश से प्रकार के साझा उदाहरण को लौटाता है, समस्या यह है कि इसे एक कन्स्ट्रक्टर या स्थिर इनिट विधि की आवश्यकता होती है। इस तरह:

private static Dictionary SharedInstances;

public static init()
{
     if (!SharedInstances.ContainsKey(T.getType()))
     {
           SharedInstances.Add(T.getType(), default(T));
     }
}

public static T getSharedInstance()
{
     return (T)SharedInstances[T.getType()];
}
0
जोड़ा