在Java中的`if`语句中声明一个变量,根据条件,它是一个不同的类型

我知道,我知道,有很多简单的答案涵盖了大多数案例,以避免这种情况。

就我而言,我想使用用户输入信息在游戏中创建CPU播放器。 如果用户选择简易模式,那么我想声明并实例化EasyPlayer类的实例。 否则,我想声明并实例化HardPlayer类的实例。 无论哪种方式,变量的特定名称必须是“cpu”,其余代码不加选择地在“cpu”上运行。 也就是说,这些操作的所有差异都构建在不同的类中,这些类是CpuPlayer类的子类。

所以这是代码:

 // Set the opponent. if (difficulty == 0){ EasyPlayer cpu = new EasyPlayer(num_rounds); } else{ HardPlayer cpu = new HardPlayer(num_rounds); } 

这给我带来了烦人的cannot find symbol错误。 从我可以阅读的内容来看,每个人都说你不能在这样的条件下进行声明,因为范围问题和它永远不会发生的可能性。

如果是这样,根据用户输入,将单个变量声明为两个不同类别之一的正确方法是什么?

 CpuPlayer cpu; if (difficulty == 0){ cpu = new EasyPlayer(num_rounds); } else{ cpu = new HardPlayer(num_rounds); } 

如果您的目的是仅调用CpuPlayer类可用的方法,那么可能使用的更好的设计模式是策略模式 。 在您的情况下,您可能会添加一个名为CpuStrategy的新类,并将您的CpuPlayer构造函数修改为:

 public CpuPlayer(CpuStrategy strategy, int num_rounds) 

这使得代码的其余部分更易于阅读,也可能更容易维护。 以下是您原始代码段的外观:

 CpuPlayer cpu = new CpuPlayer(new CpuStrategy(difficulty), num_rounds); 

我们摆脱了if / else,因为CpuStrategy类将处理难度级别之间的差异。 这也是有道理的,因为你可以从程序的内容中抽象出“难度级别”的概念,我认为这是游戏的一部分。

 CpuPlayer cpu; // Set the opponent. if (difficulty == 0){ cpu = new EasyPlayer(num_rounds); } else{ cpu = new HardPlayer(num_rounds); } 

首先声明它,然后分配它。

 // Set the opponent. CpuPlayer cpu = null; if (difficulty == 0){ cpu = new EasyPlayer(num_rounds); } else{ cpu = new HardPlayer(num_rounds); } if(cpu == null) throw new IllegalStateException(); 
 // Set the opponent. CpuPlayer cpu; if (difficulty == 0){ cpu = new EasyPlayer(num_rounds); } else{ cpu = new HardPlayer(num_rounds); } 

你可以调整你的类结构的设计。 创建一个名为Level的父类,并扩展名为EasyLevel和HardLevel的两个子类。

 class EasyLevel : public Level { //implementation specific to easy level } class HardLevel : public Level { //implementation specific to hard level } 

在您的播放器类中,添加修改构造函数以获取Level类型的参数。

 class Player { Level level; int rounds; public: Player (Level level, int num_rounds) { this.level = level; this.rounds = num_rounds; } play () { // use level variable to invoke implementation specific to the set level, hard or easy. } } 

这将使您的类结构更加可扩展。 作为一个例子,如果你将来需要添加另一个Level’media’,只需要从父类Level扩展。