2016-04-07 15 views
0

Bazı diğer sınıflar tarafından miras alınması ve Attach yöntemini kullanarak'a eklenmesi gereken bir özet sınıfım var, çünkü bazı başlatma çalışmaları (örneğin kaldırıldı) sadelik için).Özet sınıf, jenerik yöntemde mirasın türünü kullanın

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

Sonra WorldManager ve her iki soyut GameBehaviour sınıf miras WorldRenderer adlı başka sınıf var.

Ben şu kodu kullanın bu sınıfların nesnelerini "başlatmak" Kime:

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

Şimdi, açıkçası, <WorldManager> ve <WorldRenderer> gereksiz hissediyor. Benim sorum, genel türüne gerek duymamak için Attach yönteminin değiştirilip değiştirilmeyeceğidir, ancak bunun anlamlı olması durumunda, onun mirasının türünü kullanmasıdır. Muhtemelen unuttuğum ya da farkında olmadığım bazı C# konsepti var.

Her türlü geri bildirim büyük ölçüde takdir edilecektir.

cevap

2

Yöntem yerine GameBehaviour sınıfı jenerik yapabilirsiniz. Açıkçası sonuç, diğer türleri eklemek için Attach yöntemini kullanamazsınız.

Genel kısıtlama, çevrelerin içine girdiğiniz gibi görünmesini sağlar, ancak C# yazım sistemi buna izin verir.

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

Kullanımı:

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

Ah, görüyorum! Bu, "WorldManager>" adlı gereksiz yere, sınıf beyanına yöneliyor, ancak bunu diğer yoldan tercih ediyorum. Başka bir şey gelmedikçe bu çözümü kullanacaktır. Çok teşekkür ederim! –

+0

Genel parametreyi yöntem düzeyinde bırakırsanız, T öğesinin herhangi bir parametrede kullanılmadığından, türetmenin türden türetilmesinde hiçbir şey yoktur. – Maarten

+0

T: GameBehaviour 'un yerini, mümkün ise T: IGameBehaviour gibi bir yere göre değiştirmeyi öneririm. Bu şekilde biraz ayrıştırırsın. – Andre