Проблема с унаследованными классами в C # - PullRequest
1 голос
/ 24 апреля 2010

У меня есть класс под названием «Сущность» с двумя дочерними классами: «Существо» и «Предмет». (Я создаю игру.) Существо имеет две функции, называемые «Атака», одна для атаки Существ и одна для атаки Предметов. Пока все работает хорошо.

Сейчас я работаю над битой съемки, поэтому у меня есть функция SelectTarget (). Он берет все сущности (как существ, так и предметы) в поле зрения игрока, чтобы игрок мог стрелять, и позволяет игроку выбрать одного.

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

Поскольку этот вопрос выглядит пустым без какого-либо кода, и я не уверен на 100%, что мое объяснение достаточно хорошее, вот где я нахожусь:

if (Input.Check(Key.Fire)) {
    Entity target = Game.State.SelectTarget.Run();
    this.Draw();
    if (target != null) {     
        //Player.Attack(target);
        // This won't work, because I have:
        //   Player.Attack((Creature)Target)
        //   Player.Attack((Item)Target)
        // but nothing for Entity, the parent class to Creature and Item.
        return true;
    }
}

(Если выкладка игры кажется странной, значит, она похожа на мошенника.)

Ответы [ 3 ]

9 голосов
/ 24 апреля 2010

Вы ищете шаблон Посетитель .

9 голосов
/ 24 апреля 2010

Как насчет введения интерфейса IAttackable, который реализован как Creature, так и Item. Player.Attack будет иметь новую подпись Player.Attack(IAttackable target). Каждый объект, реализующий IAttackable, может получить методы для вычитания здоровья или получения значений защиты (для уменьшения баллов здоровья) и т. Д ...

3 голосов
/ 24 апреля 2010

попробуйте что-то вроде:

if(target is Creature)
      player.Attack(target as Creature);
else if(target is Item)
      player.Attack(target as Item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...