Использование обобщений для доступа к классам в игре XNA - PullRequest
0 голосов
/ 30 октября 2011

Если у меня есть класс, основанный на другом классе, как мне получить доступ к свойствам первого класса, если он может иметь любое имя? Я думал о том, чтобы использовать дженерики для доступа к свойствам, но дженерики являются «родовыми» по причине ...

Например:

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 без непосредственного вызова / реализации его в коде библиотеки.

Ответы [ 4 ]

1 голос
/ 30 октября 2011

Я бы рекомендовал изучить 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 вы запросите этот сервис и сохраните его (а не Game) для использования позже.

В качестве бонуса, IExamplePropertyService больше не нужно даже реализовывать классом Game, он может быть реализован любым GameComponent.

Это упрощает отделение классов от необходимости знать, как работают другие классы в Игре. Пока сервисы где-то существуют, ваша ReferenceToAGameInXNA может использоваться.

1 голос
/ 30 октября 2011

Я не думаю, что дженерики - это то, что вы на самом деле ищете здесь.Во втором классе просто измените тип всех gameInstance на тип класса, который вы создали для своей игры, в данном случае AGameInXNA.В каждой игре XNA должен быть только один подкласс типа Game.Это позволит вам получить доступ к любым открытым членам AGameInXNA из класса Reference.

Если это не то, что вам нужно, пожалуйста, дайте более подробное объяснение того, что вы пытаетесь достичь, и яЯ постараюсь вам помочь.

0 голосов
/ 31 октября 2011

используя "Game gameInstance";Вы не можете получить доступ к ExmpleProp.Вы должны использовать "AGameInXNA gameInstance;"слишком доступ к ExampleProp.

0 голосов
/ 30 октября 2011

Я не знаю 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.

...