Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过构造函数和“this”关键字重新分配对象_Java_Constructor_This - Fatal编程技术网

Java 通过构造函数和“this”关键字重新分配对象

Java 通过构造函数和“this”关键字重新分配对象,java,constructor,this,Java,Constructor,This,我正在尝试扩展我的程序,以允许不同的NPC具有相似的代码库。我想有一个超类NPC,每个生物都有不同的子类。在这里,我将它们称为Enemy1、Enemy2和Enemy3 我还想通过NPC敌人=新NPCenemyID;,将任何给定NPC分配给一个变量;,其中enemyID是一个整数,表示NPC的游戏内id,让Enemy1的id=1,Enemy2的id=2,Enemy3的id=3 即使这样做行得通,实际上行吗?我还没有测试它,因为实际代码将具有更深入的特性: public class NPC {

我正在尝试扩展我的程序,以允许不同的NPC具有相似的代码库。我想有一个超类NPC,每个生物都有不同的子类。在这里,我将它们称为Enemy1、Enemy2和Enemy3

我还想通过NPC敌人=新NPCenemyID;,将任何给定NPC分配给一个变量;,其中enemyID是一个整数,表示NPC的游戏内id,让Enemy1的id=1,Enemy2的id=2,Enemy3的id=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
}

我不确定这是否会编译,因为我还没有完整的实现,但我只想知道对象是否可以以这种方式自我重新分配,以及这是否是一个不错的编程选择。如果您需要澄清,请让我知道,并请在您的答案中告诉我原因,这样我就可以学习,而不仅仅是得到一个是/否的答案,因为我是自学成才的,所以反馈特别有用。

因为您目前有反馈,所以它不会编译。您要使用的模式称为a,在这里,您不直接创建对象,而是使用各种参数调用工厂函数,该函数创建并返回相应的对象

一个非常非常基本的示例可以如下所示:

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,以便让未来的开发人员(即您未来的自己)更清楚地了解代码的行为。您还可以根据需要向工厂添加任意多的参数,使其能够使用所需的任何参数一次性创建一个功能齐全的NPC。

尝试使用工厂方法,返回新构造的类。您认为这是什么?这是一个对象用来表示自身的关键字。但是,这里它不适用,因为答案不需要它;根据您的示例,每个NPC的实现都位于源代码的顶部?完全正确。另一种常见模式是将某种相关信息放入工厂本身,在这种情况下,您需要创建一个NPC工厂,然后反复使用它来创建NPC。在这种情况下,您需要从makeNPC方法中取出静态声明。