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()
方法?
答案 0 :(得分:1)
我如何确保每种武器的射击和装填方法都是正在运行的武器?即如何将所选枪支另存为变量,以便我可以运行类似
currentWeapon.Shoot
之类的东西,以确保它是当前选择的武器,而不是pistol.Shoot()
方法?
在switch语句中,将创建的武器分配给代表任何武器的变量。该变量必须是您界面的类型。
因此,在第1步中,为所有武器(枪支)创建界面。它们的操作均类似,但发射时会有所区别。这是polymorphism,可以通过interface或abstract 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;
}