Сохранение объекта из регистра в общей переменной - PullRequest
0 голосов
/ 17 сентября 2018
Console.WriteLine("Please, choose your weapon. \n1: Glock 18 \n2:");

switch (choice)
{
    case 1:
        Glock18 glock18 = new Glock18() ;
        break;
}


 Console.WriteLine("Let's shoot. Press space to fire and 'r' to reload. ('q' to quit) \n");

while (true)
{
    ConsoleKeyInfo input = Console.ReadKey(true);
    if (char.IsWhiteSpace(input.KeyChar))
    {
        pistol.Shoot();
    }
}

Мне нужно написать программу, в которой я могу выбрать оружие с помощью распределительного шкафа, но реализация конкретного оружия отличается друг от друга (Глок звучит иначе и имеет другой размер магнита, чем, например, пустынный орел). )

Как я могу убедиться, что методы стрельбы и перезарядки для каждого оружия являются теми, которые используются? То есть как сохранить выбранное оружие как переменную, чтобы я мог запустить что-то вроде currentWeapon.Shoot, что гарантирует, что это оружие выбрано в настоящее время, а не pistol.Shoot() метод?

Ответы [ 5 ]

0 голосов
/ 17 сентября 2018

Код неполный или это фактический код? Потому что с предоставленным кодом вы не получаете никакой информации от пользователя. Попробуйте это:

Console.WriteLine("Please, choose your weapon. \n1: Glock 18 \n2:");
string choice = Console.ReadLine();
switch (choice)
{
    case 1:
        Glock18 glock18 = new Glock18() ;
        break;
}
0 голосов
/ 17 сентября 2018

Как я могу убедиться, что методы стрельбы и перезагрузки для каждого оружия - те, которые используются?Т.е. как сохранить выбранное оружие как переменную, чтобы я мог запустить что-то вроде currentWeapon.Shoot, что гарантирует, что это оружие выбрано в настоящее время, вместо метода pistol.Shoot()?

Inваш оператор switch назначает оружие, которое вы создали, переменной, представляющей любое оружие.Эта переменная должна относиться к типу вашего интерфейса.

Итак, шаг 1, создайте интерфейс для всего вашего оружия (оружия).Все они работают одинаково, но дифференцируются при увольнении.Это полиморфизм , который доступен вам через интерфейс или абстрактный класс .

interface IWeapon
{
    void Shoot();
    void Reload();
    bool HasAmmo { get; }
    void MakeClickSound();
}

Затем различные классы (реализациядо вас):

class BasicPistol : IWeapon { ... }
class Glock18: IWeapon { ... }
class GiganticLaserBlaster: IWeapon { ... }

Затем в коде "action" объявите переменную, которая относится к типу вашего интерфейса.Это выбранное оружие.

IWeapon chosenWeapon;

Назначьте эту переменную в вашем выражении switch (хотя фабрика была бы лучше здесь, как говорят некоторые другие ответы).

switch (choice)
{
    case 1:
        chosenWeapon = new Glock18() ;
        break;
    case 2:
        chosenWeapon = new GiganticLaserBlaster() ;
        break;
    ...
    default:
        chosenWeapon = new BasicPistol();
        break
}

Тогда делай что хочешь со своим оружием.Вы знаете, что это правильный метод, потому что у вас есть правильное оружие.

while (true)
{
    ConsoleKeyInfo input = Console.ReadKey(true);
    if (char.IsWhiteSpace(input.KeyChar))
    {
        if (chosenWeapon.HasAmmo)
            chosenWeapon.Shoot();
        else
           chosenWeapon.MakeClickSound();
    }
    else if (input.KeyChar == 'r')
        chosenWeapon.Reload();
}
0 голосов
/ 17 сентября 2018

Я думаю, что Glock реализует интерфейс IPistol, я прав?Если это так, вы можете сделать что-то подобное:

IPistol pistol;  

Console.WriteLine("Please, choose your weapon. \n1: Glock 18 \n2:");
            switch (choice)
            {
                case 1:
                    pistol = new Glock18() ;
                    break;
                case 2:
                    pistol = new WaltherP99() ;
                    break;
                default:
                    pistol = new BasicGun() ;
                    break;
            }


            Console.WriteLine("Let's shoot. Press space to fire and 'r' to reload. ('q' to quit) \n");

            while (true)
            {
                ConsoleKeyInfo input = Console.ReadKey(true);
                if (char.IsWhiteSpace(input.KeyChar))
                {
                    pistol.Shoot();
                }
0 голосов
/ 17 сентября 2018

Вы можете попытаться использовать шаблон facotry , чтобы предоставить Weapon для вашего кода.

создайте интерфейс для всей базы оружия, в интерфейсе есть метод Shoot.

public interface IWeapon {
    void Shoot();
}

затем пусть Glock18 или оружие другого типа реализует интерфейс IWeapon и создает собственную логику в методе.

public class Glock18 : IWeapon
{
    public void Shoot()
    {
        // Do Glock18 shoot thing
    }
}

WeaponFactory обеспечивает создание кода для производства оружия.

public class WeaponFactory {
    public static IWeapon GetWeapon(int choice)
    {
        IWeapon weapon = null;
        switch (choice)
        {
            case 1:
                weapon = new Glock18();
                break;
        }
        return weapon;
    }
}

тогда вы можете получить оружие по классу WeaponFactory, пройдите какой режим оружия вы хотели.

IWeapon weapon = WeaponFactory.GetWeapon(choice);
0 голосов
/ 17 сентября 2018

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

см. Здесь один из моих лучших ответов по тому же вопросу: В чем разница между наследованием и полиморфизмом?

...