我知道,我知道,有很多简单的答案涵盖了大多数案例,以避免这种情况。
在我的情况下,我想使用用户输入信息在游戏中创建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
错误。从我可以阅读的内容来看,每个人都说你不能在这样的条件下进行声明,因为范围问题和它永远不会发生。
如果是这样,根据用户输入,将单个变量声明为两个不同类别之一的正确方法是什么?
答案 0 :(得分:11)
CpuPlayer cpu;
if (difficulty == 0){
cpu = new EasyPlayer(num_rounds);
}
else{
cpu = new HardPlayer(num_rounds);
}
答案 1 :(得分:2)
如果您打算只调用CpuPlayer类可用的方法,那么可能使用的更好的设计模式是 Strategy Pattern 。在您的情况下,您可能会添加一个名为 CpuStrategy 的新类,并将您的CpuPlayer构造函数修改为:
public CpuPlayer(CpuStrategy strategy, int num_rounds)
这使得代码的其余部分更易于阅读,也可能更易于维护。以下是您原始代码片段的样子:
CpuPlayer cpu = new CpuPlayer(new CpuStrategy(difficulty), num_rounds);
我们摆脱了if / else,因为CpuStrategy类将处理难度级别之间的差异。这也是有道理的,因为你可以从程序的内容中抽象出“难度级别”的概念,我认为这是游戏的一部分。
答案 2 :(得分:1)
CpuPlayer cpu;
// Set the opponent.
if (difficulty == 0){
cpu = new EasyPlayer(num_rounds);
} else{
cpu = new HardPlayer(num_rounds);
}
答案 3 :(得分:0)
首先声明它,然后分配它。
// 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();
答案 4 :(得分:0)
// Set the opponent.
CpuPlayer cpu;
if (difficulty == 0){
cpu = new EasyPlayer(num_rounds);
} else{
cpu = new HardPlayer(num_rounds);
}
答案 5 :(得分:0)
您可以调整类结构的设计。创建一个名为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扩展。
答案 6 :(得分:0)
CpuPlayer cpu = difficulty == 0
? new EasyPlayer(num_rounds)
: new HardPlayer(num_rounds);
cpu
也可以设为final
。