Créer une variable statique pour chaque enfant d'une classe de base et l'obtenir

J'ai une classe de gestionnaire abstraite 'ManagerBase' que je veux dériver et dont plusieurs enfants ont tous des références statiques.

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;
}

Ainsi

public class EventMessageManager : ManagerBase  {

}

Idéalement, j'aimerais pouvoir accéder à l'instance partagée de 'EventMessageManager' en utilisant la variable héritée 'SharedInstance'

comme

EventMessageManager.SharedInstance.whatever();

Comment pourrais-je obtenir cette fonctionnalité? Vous pouvez voir que j'ai commenté dans les erreurs de compilation à la classe de gestionnaire de base.

I was originally using a static variable in the 'MangerBase' Ainsi

public static ManagerBase SharedInstance

Mais pour obtenir les références statiques des enfants était trop long et pas aussi soigné

EventMessageManager manager = EventMessageManager.SharedInstance as EventMessageManager;

Merci d'avance

3
Tout votre problème est résolu si vous modifiez votre définition SharedInstance en tant que public static ManagerBase SharedInstance = par défaut (ManagerBase ); mais je ne suis pas sûr de combien Cela peut vous aider. Ou peut-être avez-vous besoin d'écrire un opérateur de conversion implicite de T vers ManagerBase
ajouté l'auteur nawfal, source
En supposant que l'utilisation de champs statiques est une bonne idée dès le début. Essayez "SharedInstance = new T;" au lieu. Vous devrez appliquer une nouvelle contrainte() sur le paramètre générique pour que cela fonctionne.
ajouté l'auteur Emil Lundin, source

2 Réponses

Je ne suis pas sûr exactement pourquoi vous voulez faire un tel modèle (quelques informations supplémentaires pourraient aider), mais ce qui suit devrait fonctionner:

public abstract class ManagerBase : MonoBehaviour where T : ManagerBase

et

SharedInstance = this as T;
2
ajouté
Fonctionne comme un charme, merci.
ajouté l'auteur user2229618, source

Vous pouvez créer une méthode getSharedInstance() qui renvoie l'instance partagée du type à partir d'un dictionnaire, le problème est qu'il nécessite un constructeur ou une méthode init statique. comme ça:

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
ajouté