Получение переменных из унаследованного класса в c # - PullRequest
3 голосов
/ 24 февраля 2012

У меня проблема с тем, что у меня есть список одного класса (DrawableGameComponent) со многими экземплярами разных типов классов, унаследованных от DrawableGameComponent.

Дело в том, что я хочу получить доступ к переменной из одного из этих классов, но поскольку они объявлены как DrawableGameComponent, я не могу получить доступ ни к какой другой переменной, кроме DrawableGameComponent.

основной класс:

List<DrawableGameComponent> entities = new List<DrawableGameComponent>();

класс "player":

public Color color;
public int score;

Есть идеи, как я могу получить доступ к этим переменным из основного класса?

Ответы [ 7 ]

2 голосов
/ 24 февраля 2012

Если DrawableGameComponent является базой для Player, вы можете сделать это:

foreach(DrawableGameComponent entity in entities)
{
    Player player = entity as Player;
    if(player != null)
    {
        Color col = player.color;
        int score = player.score;
    }
}

Поскольку 'is', 'as' и кастинг относительно дороги, предпочтительнее сделать это один раз - как указано выше.

1 голос
/ 24 февраля 2012

Кажется, что ваша модель наследования неверна: если переменная (я предполагаю, что Цвет в вашем примере) объявлена ​​во всех / большинстве производных классов (таких как игрок, бот, противник и т. Д.), Она должна быть объявлена ​​в базовом классе.Производные классы, которые не используют Цвет, могут игнорировать его

1 голос
/ 24 февраля 2012

Райан П получил право на это.Если вы уверены, что Player является производным от DrawableGameComponent, вы можете привести экземпляр DrawableGameComponent к Player, как показано выше.

Однако учтите, что некоторые из этих экземпляров DrawableGameComponent могут отличаться от Player.Возможно, враг, например.Вы не говорите конкретно, что вы делаете с экземпляром, но такого рода удручение обычно представляет проблему проектирования.

Просто кое-что рассмотреть.

0 голосов
/ 24 февраля 2012

Я предполагаю, что вы знаете, что можете разыграть что-то вроде этого:

Player p = (Player)entities[0];

Так что, я думаю, у вас есть проблема дизайна.Вы всегда можете использовать оператор is, чтобы определить, является ли объект Player, но у вас могут возникнуть проблемы в будущем, если у вас слишком много RTTI.Если это только один экземпляр, кастинг - это хороший выбор, потому что он необходим.

0 голосов
/ 24 февраля 2012

Если вы хотите получить доступ к свойствам, определенным в унаследованном классе, вам нужно привести его к этому типу. DrawableGameComponent экземпляры типа могут предоставлять только свойства внутри него (или любой тип, который он наследует, например, от system.object)

Так что если у вас есть следующее:Вы можете получить доступ к свойству MyWidth только тогда, когда у вас есть экземпляр Player:

Player playerObj = dgcObj as Player;  
if (playerObj != null) Console.Write(playerObj.MyWidth);

, тогда как следующее не будет работать:

DrawableGameComponent dgcObj = new Player();  
dgcObj.MyWidth // no such property 
0 голосов
/ 24 февраля 2012

короткий ответ

if(entity[0] is Player)
{
   ((Player)entity[0]).color
}
0 голосов
/ 24 февраля 2012

Предполагая, что эти классы находятся в одном проекте (области действия), вы можете использовать следующее:

if (dgc is Player)
{
    (dgc as Player).color = Colors.Red;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...