将开关大小写中的对象保存在公共变量

时间:2018-09-17 16:15:23

标签: c# variables inheritance switch-statement

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();
    }
}

我必须编写一个程序,在该程序中可以使用开关盒选择武器,但是特定武器的实现方式互不相同(例如,一个glock听起来与沙漠鹰不同,并且像子大小不同) )

我如何确保每种武器的射击和装填方法都是正在运行的武器?即如何将所选枪支另存为变量,以便我可以运行类似currentWeapon.Shoot之类的东西,以确保它是当前选择的武器,而不是pistol.Shoot()方法?

5 个答案:

答案 0 :(得分:1)

  

我如何确保每种武器的射击和装填方法都是正在运行的武器?即如何将所选枪支另存为变量,以便我可以运行类似currentWeapon.Shoot之类的东西,以确保它是当前选择的武器,而不是pistol.Shoot()方法?

在switch语句中,将创建的武器分配给代表任何武器的变量。该变量必须是您界面的类型。

因此,在第1步中,为所有武器(枪支)创建界面。它们的操作均类似,但发射时会有所区别。这是polymorphism,可以通过interfaceabstract class使用。

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

然后创建各种类(具体取决于您的实现):

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

然后在“操作”代码中,声明属于您接口类型的变量。这是选择的武器。

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();
}

答案 1 :(得分:0)

您需要同时使用继承和多态,因此,当您在类型为base-class(或interface)的对象上调用方法时,实际上将改为调用派生类的虚方法,

请参阅此处有关同一问题的最佳答案之一: what's the difference between inheritance and polymorphism?

答案 2 :(得分:0)

我猜是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();
                }

答案 3 :(得分:0)

您可以尝试使用facotry pattern为您的代码提供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);

答案 4 :(得分:0)

您的代码是不完整的还是实际的代码?因为使用提供的代码,您不会从用户那里得到任何输入。试试这个:

Console.WriteLine("Please, choose your weapon. \n1: Glock 18 \n2:");
string choice = Console.ReadLine();
switch (choice)
{
    case 1:
        Glock18 glock18 = new Glock18() ;
        break;
}