使用泛型访问XNA游戏中的类

时间:2011-10-30 13:21:04

标签: c# generics reference 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属性?< / p>

编辑:我正在努力使其能够在以后重用此代码。我希望能够拥有一个未知的类,例如public class unknownclassname扩展另一个类,例如Microsoft.Xna.Framework.Game,并且能够访问类unknownclassname而无需直接调用/实现它在图书馆代码中。

4 个答案:

答案 0 :(得分:1)

我不认为仿制药是你在这里寻找的东西。在第二节课中,只需将所有gameInstance的类型更改为您为游戏创建的课程类型,在本例中为AGameInXNA。每个XNA游戏中只需要一个Game类型的子类。这将允许您从Reference类访问AGameInXNA的任何公共成员。

如果这不是你想要的,请详细解释你想要完成的事情,我会尽力帮助你。

答案 1 :(得分:1)

我建议您查看XNA Services

例如,您可以创建一个可以像

一样简单的服务
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;  
     }    
}    

实现它,并将其注册到Game组件,然后在ReferenceToAGameInXNA中,您将查询此服务并将其存储(而不是游戏)以供以后使用。

作为额外的好处,IExamplePropertyService甚至不再需要由Game类实现,它可以由任何GameComponent实现。

这使得一个简单的方法可以让学生不必了解游戏中其他类的内部工作原理。只要服务存在于某处,就可以使用ReferenceToAGameInXNA。

答案 2 :(得分: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中使用该界面。

答案 3 :(得分:0)

使用“Game gameInstance;”你无法访问ExmpleProp。你应该使用“AGameInXNA gameInstance;”也访问ExampleProp。