2011-10-30 11 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のプロパティにアクセスしてください。

EDIT:このコードを後で再利用できるようにしています。 Microsoft.Xna.Framework.Gameのように別のクラスを拡張するpublic class unknownclassnameのような未知のクラスを持つことができ、ライブラリコードで直接呼び出し/実装することなくクラスunknownclassnameにアクセスできるようにしたいと考えています。

答えて

1

を調べることをおすすめします。

は、したがって、たとえば、あなたは、あなたのReferenceToAGameInXNAに、あなたはこのサービスに問い合わせるだろう、それを実装し、ゲームのコンポーネントに登録

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

のような単純なものでしたサービスを作成しますと、後で使用するために(ゲームではなく)それを保管してください。

ボーナスメリットとして、IExamplePropertyServiceはGameクラスで実装する必要がなくなり、GameComponentによって実装できます。

これは、クラスがゲーム内の他のクラスの内部の動作について知る必要がないようにするための簡単な方法です。サービスがどこかに存在する限り、ReferenceToAGameInXNAを使うことができます。

1

ジェネリックスはあなたが実際にここで探しているものだとは思わない。 2番目のクラスでは、gameInstanceのすべてのタイプをゲーム用に作成したクラスのタイプ(この場合はAGameInXNA)に変更してください。各XNAゲームでゲームタイプの1つのサブクラスのみが必要です。これにより、参照クラスから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; 
    } 
} 

他に分類された場合は持っていますExampleGamePropertyGameから継承しないでください。代わりにインターフェイスを作成できます。 AGameInXNAは、Gameから直接継承し、インターフェイスも実装します。そして、あなたはそのインターフェイスでReferenceToAGameInXNAで作業します。

+0

'AGameInXNA'でのみ定義されているプロパティがいくつかある場合、どのようにこれらのプロパティにアクセスできますか? –

+0

あなたはそれが 'AGameInXNA'であることを知っています。あなたが得るものが 'Game'ですが、実際に' AGameInXNA'だと分かっていれば、キャスティングを使うことができます。 – svick

0

"Game gameInstance;"を使用するExmplePropにアクセスできません。あなたは "AGameInXNA gameInstance;" ExamplePropにもアクセスします。

関連する問題