我正在尝试扩展我的程序,以允许具有类似代码库的不同NPC。我希望有一个超级NPC,每个生物都有各种子类。在这里,我将称之为Enemy1,Enemy2和Enemy3。
我还希望通过NPC enemy = new NPC(enemyID);
将任何给定的NPC分配给变量,其中“enemyID”是表示NPC游戏内id的整数(让Enemy1的ID = 1,Enemy2 = 2,Enemy3 = 3)
即使这样可行,但在实践中是否可行(我还没有测试过,因为实际的代码会有更深入的功能):
public class NPC
{
public NPC(int id)
{
switch (id)
{
case 1:
{
this = new Enemy1();
break;
}
case 3:
{
this = new Enemy3();
break;
}
case 3:
{
this = new Enemy3();
break;
}
}
}
//Various default and shared methods will follow
}
public class Enemy1 extends NPC
{
//Various variables specific to this enemy
public Enemy1() //LOL
{
//Assign default values
}
//Default methods overwritten and enemy-specific methods go here
}
我不确定是否会编译,因为我还没有完整的实现,但我只是想知道一个对象是否可以这种方式自我重新分配,如果这是一个好的编程选择。如果你需要澄清,请告诉我,请在答案中给我理由,这样我就可以学习而不只是得到一个是/否答案(我是自学成才,所以反馈特别有用)。
答案 0 :(得分:0)
如你所知,它不会编译。您正在寻找的模式称为factory,而不是直接创建对象,而是调用"工厂"具有各种参数的函数,该函数创建并返回适当的对象。
一个非常非常基本的例子看起来像这样:
public class Enemy1 extends NPC {
}
public class Enemy2 extends NPC {
}
public class NPCFactory {
public static NPC makeNPC(int npcType) {
if(npcType==1){ return new Enemy1(); }
elif(npcType==2) {return new Enemy2(); }
}
}
随着您的代码的增长,您可能希望将int npcType
替换为正确的Enum
,以使您的代码行为更清晰,以便将来的开发人员(即您未来的自我) )。您还可以根据需要向工厂添加任意数量的参数,从而可以一次性创建具有您需要的任何参数的全功能NPC。