Разные объекты из одного интерфейса с разными методами и свойствами - PullRequest
0 голосов
/ 20 января 2019

Вот мой интерфейс

interface IEnemy
    {
        int Health { get; set; }
    }

и несколько классов, производных от него

public class Goblin : IEnemy
    {
        public int Health { get; set; }
        public Goblin()
        {
            Health = 50;
            Console.WriteLine("You encounter an Enemy Goblin!");
        }
    }
public class Undead : IEnemy
    {
        public int Health { get; set; }
        public Undead()
        {
            Health = 100;
            Console.WriteLine("You encounter an Enemy Undead!");
        }
    }
public class Orc : IEnemy
    {
        public int Health { get; set; }
        public Orc()
        {
            Health = 150;
            Console.WriteLine("You encounter an Enemy Orc!");
        }
    }

И, скажем, я хочу сделать рандомизатор, который выберет врага, которого я ищу. Я делаю что-то вроде этого

IEnemy enemy = new Goblin() or Undead() or Orc()...

И все работает как задумано, но, например, когда у одного объекта, скажем, Гоблина, есть метод, которого нет в интерфейсе, как я могу вызвать этот метод, если враг имеет тип IEnemy?

1 Ответ

0 голосов
/ 20 января 2019

Вы можете написать

if (enemy is Goblin goblin) {
    goblin.CallGoblinMethod();
}

Но вопрос в том, хороший ли это дизайн. Было бы предпочтительно иметь методы с универсальным «вкусом», которые по-разному реализуются в разных объектах. Они могут даже быть пустыми в некоторых объектах.

Или вы можете обобщить поведение через другой интерфейс

interface IThief
{
    void Steal();
}

public class Goblin : IEnemy, IThief
{
    public int Health { get; set; }
    public Goblin()
    {
        Health = 50;
        Console.WriteLine("You encounter an Enemy Goblin!");
    }

    public void Steal()
    {
        //TODO: steal
    }
}

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

if (enemy is IThief thief) {
    thief.Steal();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...