2017-04-21 7 views
6

मेरे पास ServiceManager नामक एक सरल सेवा प्रबंधक है जिसमें दो विधियां हैं। Create() एक सेवा का एक उदाहरण बनाता है। Provide() एक सेवा देता है जो पहले बनाया गया था।प्रकारों और उदाहरणों के उदाहरण से उदाहरण प्राप्त करें

मेरे पास एक बुनियादी कार्यान्वयन है जो काम करता है लेकिन मुझे लगता है कि क्लीनर तरीका है या नहीं। यह ServiceManager की मेरी बुनियादी दिया गया है:

public class ServiceManager : MonoBehaviour 
{ 
    private Dictionary<Type, MonoBehaviour> services = new Dictionary<Type, MonoBehaviour>(); 

    public void Create<T>() where T : MonoBehaviour 
    { 
     // Create service 
     GameObject serviceObject = new GameObject(typeof(T).Name); 
     serviceObject.transform.SetParent(transform); // make service GO our child 
     T service = serviceObject.AddComponent<T>(); // attach service to GO 

     // Register service 
     services.Add(typeof(T), service); 
    } 

    public T Provide<T>() where T : MonoBehaviour 
    { 
     return (T)services[typeof(T)]; // notice the cast to T here 
    } 
} 

सेवा का उपयोग करना आसान है:

public class ServiceTest : MonoBehaviour 
{ 
    private void Start() 
    { 
     // Creating services 
     ServiceManager services = FindObjectOfType<ServiceManager>(); 
     services.Create<MapService>(); 
     services.Create<InteractionService>(); 
    } 

    private void Example() 
    { 
     // Get a service 
     ServiceManager services = FindObjectOfType<ServiceManager>(); 
     MapService map = services.Provide<MapService>(); 
     // do whatever you want with map 
    } 
} 

मेरा प्रश्न ServiceManager.Provide() बारे में है। शब्दकोश से आइटम प्राप्त करने के बाद टी को कास्ट पर ध्यान दें। यह बहुत अशुद्ध महसूस करता है और मुझे आश्चर्य होता है कि अगर मैं सी # में जेनेरिक काम कैसे करता हूं, तो मुझे कुछ याद आ रहा है। क्या मैं पूरा करने की कोशिश कर रहा हूं जो करने के लिए अन्य/बेहतर तरीके हैं?

+1

* "यह बहुत अशुद्ध महसूस करता है" * - मेरे लिए यह नहीं है। मेरे लिए यह ठीक लग रहा है। जेनेरिक आपके लिए कुछ भी जादू नहीं करने जा रहे हैं। यह एक कलाकार है; वे दुर्घटना से भाषा में नहीं हैं। तुम अच्छे हो। –

+0

@EdPlunkett ठीक है, धन्यवाद! बस यह सुनिश्चित करना चाहता था कि ऐसा कुछ नहीं था जिसे मैं समझ नहीं पाया था। चीयर्स। –

उत्तर

3

यहां सुधार करने के लिए कुछ भी नहीं है। कलाकार आवश्यक है क्योंकि शब्दकोश मान प्रकार MonoBehaviour है। आप जानते हैं कि यह वास्तव में T है, लेकिन संकलक नहीं करता है। आपको इसे कास्टिंग करके बताना होगा।

आपने अच्छा किया।

+0

स्पष्टीकरण के लिए धन्यवाद! मैं बस यह सुनिश्चित करना चाहता था कि मैं कुछ भी नहीं देख रहा था। चीयर्स। –

+0

मुझे लगता है कि एक शब्दकोश के साथ एक शब्दकोश से बेहतर है, अगर ऐसा लगता है कि प्रति प्रकार केवल एक उदाहरण है। मेरा जवाब देखें –

1

यदि प्रति प्रकार केवल एक उदाहरण है, तो बेहतर है। यदि आप कई ServiceManagers तो यह काम नहीं करेगा है,

public class ServiceTest : MonoBehaviour 
{ 
    private void Start() 
    { 
     // no need to Create services 
     // They will be created when Provide is first called on them 
     // Though if you want them up and running at Start, call Provide 
     // on each here. 
    } 

    private void Example() 
    { 
     // Get a service 
     ServiceManager services = FindObjectOfType<ServiceManager>(); 
     MapService map = services.Provide<MapService>(); 
     // do whatever you want with map 
    } 
} 

इसके अलावा: एक स्थिर सामान्य प्रकार

using UnityEngine; 

public class ServiceManager : MonoBehaviour 
{ 
    // If this T confuses you from the generic T used elsewhere, rename it 
    public static Transform T { get; private set; } 

    void Awake() 
    { 
     T = transform; 
    } 

    public T Provide<T>() where T : MonoBehaviour 
    { 
     return ServiceMap<T>.service; // no cast required 
    } 
} 

static class ServiceMap<T> where T : MonoBehaviour 
{ 
    public static readonly T service; 

    static ServiceMap() 
    { 
     // Create service 
     GameObject serviceObject = new GameObject(typeof(T).Name); 
     serviceObject.transform.SetParent(ServiceManager.T); // make service GO our child 
     service = serviceObject.AddComponent<T>(); // attach service to GO 
    } 
} 

सेवा का उपयोग करने पर विचार करें सरल है।

संबंधित मुद्दे