2016-04-07 19 views
0

他のさまざまなクラスに継承され、Attachメソッドを使用してGameObjectメソッドにアタッチされる抽象クラスがあります。初期化作業はです簡単のために)。抽象クラス、ジェネリックメソッドの継承者の型を使用する

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

私はその後、WorldManagerとの両方が抽象GameBehaviourクラスを継承WorldRendererと呼ばれる別のクラスを持っています。

は、私は次のコードを使用し、これらのクラスのオブジェクトを「初期化」するには、次の

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

が今、明らかに、<WorldManager><WorldRenderer>が冗長に感じています。私の質問は、Attachメソッドをジェネリック型を必要としないように変更することが可能かどうかです。代わりに継承者の型を使用してください。多分私が忘れている、または気づいていないC#の概念があります。

フィードバックは高く評価されます。

答えて

2

私は、メソッドの代わりにGameBehaviourクラスを汎用にすることができると思います。明らかに、他のタイプの添付にはAttachメソッドを使用できません。

一般的な制約は、あなたが円を描いているように見せかけますが、C#の入力システムではこれが問題ありません。

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> { ... } 

使用法:

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

ああ、なるほど!それは、一見冗長な ''をクラス宣言に置き換えますが、私はそれを他の方法よりも優先します。 何か他のことが現れない限り、この解決方法を使用します。どうもありがとうございました! –

+0

ジェネリックパラメータをメソッドレベルに残すと、Tがどのパラメータでも使用されていないため、コンパイラはfromを型から推測することはありません。 – Maarten

+0

私はどこにT:GameBehaviour を置き換えることをお勧めします。T:IGameBehaviourが可能なら、この方法で、あなたはそれを少しデカップリングします。 – Andre

関連する問題