2016-04-07 3 views
0

Ich habe eine abstrakte Klasse, die von verschiedenen anderen Klassen vererbt werden soll und an eine GameObject mit der Attach Methode, wie es einige Initialisierungsarbeiten (im Beispiel entfernt zur Vereinfachung).Abstrakte Klasse, verwenden Sie den Typ des Vererbers in der generischen Methode

public abstract class GameBehaviour : MonoBehaviour 
{ 
    private bool initialized = false; 

    public void Initialize(GameState gameState) 
    { 
     initialized = true; 
    } 

    public static T Attach<T>(GameObject parent, GameState gameState) where T : GameBehaviour 
    { 
     T behaviour = parent.AddComponent<T>(); 
     behaviour.Initialize(gameState); 
     return behaviour; 
    } 
} 

ich dann eine andere Klasse namens WorldManager und WorldRenderer, die sowohl die abstrakte GameBehaviour Klasse erben.

zu "initialisieren" Objekte dieser Klassen ich den folgenden Code verwenden:

WorldManager manager = WorldManager.Attach<WorldManager>(gameObject, this); 
WorldRenderer renderer = WorldRenderer.Attach<WorldRenderer>(gameObject, this); 

Nun, natürlich, die <WorldManager> und <WorldRenderer> überflüssig fühlt. Meine Frage ist, ob es möglich ist, die Attach Methode zu ändern, um nicht den generischen Typ zu benötigen, sondern stattdessen den Typ des Erben, wenn das Sinn macht. Es gibt wahrscheinlich ein C# -Konzept, über das ich vergesse oder nichts weiß.

Jede Rückmeldung würde sehr geschätzt werden.

Antwort

2

Ich denke, Sie können die GameBehaviour Klasse generisch anstelle der Methode machen. Offensichtlich können Sie die Methode Attach nicht verwenden, um andere Typen anzuhängen.

Die generische Einschränkung macht es so, als ob Sie in Kreisen gehen würden, aber das C# -Typing-System erlaubt das ganz gut. siehe

WorldManager manager = WorldManager.Attach(gameObject, this); 
WorldRenderer renderer = WorldRenderer.Attach(gameObject, this); 
+0

Ah, I:

public abstract class GameBehaviour : MonoBehaviour { private bool initialized = false; public void Initialize(GameState gameState) { initialized = true; } } public abstract class GameBehaviour<T> : GameBehaviour where T: GameBehaviour<T> { public static T Attach(GameObject parent, GameState gameState) { T behaviour = parent.AddComponent<T>(); behaviour.Initialize(gameState); return behaviour; } } public class WorldManager: GameBehaviour<WorldManager> { ... } public class WorldRenderer: GameBehaviour<WorldRenderer> { ... } 

Verbrauch! Das verschiebt den scheinbar überflüssigen '' stattdessen in die Klassendeklaration, aber ich bevorzuge das andersherum. Wird diese Lösung verwenden, wenn nicht etwas anderes auftaucht. Vielen Dank! –

+0

Wenn Sie den generischen Parameter auf Methodenebene belassen, dann hat der Compiler nichts, woraus der Typ abgeleitet werden kann, da das T in keinem Parameter verwendet wird. – Maarten

+0

Ich würde vorschlagen, die wo ersetzen T: GameBehaviour durch etwas wie T: IGameBehaviour, wenn das möglich ist. Auf diese Weise würden Sie es ein wenig entkoppeln. – Andre

Verwandte Themen