2011-10-30 24 views
0

如果我有一個基於另一個類的類,如果可以有任何名稱,如何訪問第一個類的屬性?我想使用泛型訪問屬性,但仿製藥是有原因的「通用」 ...使用泛型訪問XNA遊戲中的類

例如:

public class AGameInXNA : Microsoft.Xna.Framework.Game 
{ 
    int ExampleGameProperty; 
} 

// ... another class ... // 

public class ReferenceToAGameInXNA 
{ 
    Game gameInstance; 
    public void SetGameInstance(Game game) 
    { 
      gameInstance = game; 
    } 

    public void SetExampleGameProperty() 
    { 
      gameInstance.ExampleGameProperty = 21; // I don't know the name of 
               // AGameInXNA, so I want to 
               // access it using a generic 
               // class. 
    } 
} 

我知道,那是不行的,所以我會怎樣如果我不知道AGameInXNA的名字,在這種情況下使用泛型來訪問另一個類中的AGameInXNA的屬性?

編輯:我想讓它,以便我可以稍後重用此代碼。我希望能夠擁有一個未知的類,例如public class unknownclassname,它擴展了另一個類,如Microsoft.Xna.Framework.Game,並且能夠訪問類unknownclassname,而無需在庫代碼中直接調用/實現它。

回答

1

我建議您調查。

因此,例如,您將創建這可能是這麼簡單的

interface IExamplePropertyService 
{ 
    int ExampleProperty { get; set; } 
} 

public class AGameInXNA : Microsoft.Xna.Framework.Game, IExamplePropertyService 
{ 
    int ExampleGameProperty { get; set; } 

    void Initialize() 
    { 
     // Do other initialization 
     Services.Add(typeof(IExamplePropertyService), this); 
    } 
} 

public class ReferenceToAGameInXNA  
{  
    IExamplePropertyService propertyService;  
    public void GetGameInstance(Game game)  
    {  
      propertyService = (IExamplePropertyService)game.GetService(typeof(IExamplePropertyService));  
    }  

    public void SetExampleGameProperty()  
    {  
      propertyService.ExampleGameProperty = 21; 
    }  
}  

實現它,並與遊戲組件註冊,然後在您的ReferenceToAGameInXNA服務,你會查詢這項服務和存儲它(而不是遊戲)供以後使用。

作爲一項額外的好處,IExamplePropertyService不再需要由Game類實現,它可以由任何GameComponent實現。

這使得一個簡單的方法來分離類,以瞭解其他類在遊戲中的內部運作。只要服務存在於某個地方,就可以使用您的ReferenceToAGameInXNA。

1

我不認爲仿製藥是你在這裏實際尋找的。在第二堂課中,將所有gameInstance的類型更改爲您爲遊戲創建的班級的類型,在此例中爲AGameInXNA。在每個XNA遊戲中,只應該需要遊戲類型的一個子類。這將允許您訪問Reference類中的任何公開成員AGameInXNA

如果這不是你所追求的,請給出你想要完成的更詳細的解釋,我會盡力幫助你。

0

我不知道XNA,但是如果你想有幾個繼承自Game的類,並且它們都具有相同的屬性,那麼可以創建一個從Game繼承的抽象類,並讓其他類繼承自相反。

(此外,您GetGameInstance()是嚴重命名,是因爲它領域,它不明白這一點。而且這可能是因爲物業更好反正。)

public abstract class GameBase : Microsoft.Xna.Framework.Game 
{ 
    public int ExampleGameProperty { get; set; } 
} 

public class AGameInXNA : GameBase 
{ 
    // code specific to AGameInXNA 
} 

public class ReferenceToAGameInXNA 
{ 
    public GameBase GameInstance { get; set; } 

    public void SetExampleGameProperty() 
    { 
      GameInstance.ExampleGameProperty = 21; 
    } 
} 

如果其他歸類有ExampleGameProperty不應該從Game繼承,您可以改爲創建一個接口。然後AGameInXNA將直接從Game繼承,它也會實現該接口。你將在ReferenceToAGameInXNA中使用該接口。

+0

如果我有幾個屬性僅在'AGameInXNA'中定義,我將如何訪問這些特定屬性? –

+0

然後你知道它是'AGameInXNA',你應該這樣對待它。如果你得到的是'Game',但你知道它實際上是'AGameInXNA',你可以使用cast。 – svick

0

使用「Game gameInstance;」你不能使用ExmpleProp。你應該使用「AGameInXNA gameInstance;」也訪問ExampleProp。