Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 如何在构造函数中创建给定类型的新对象_Java_Oop_Polymorphism - Fatal编程技术网

Java 如何在构造函数中创建给定类型的新对象

Java 如何在构造函数中创建给定类型的新对象,java,oop,polymorphism,Java,Oop,Polymorphism,我很难弄清楚如何基于给定类型在构造函数中创建新对象 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本机器人。但是我有另一个构造器,它根据这个参数创建了一个新的机器人 public RobotDriver() { this.robot = new BasicRobot(); } public RobotDriver(Robot robot) { //don't know what to do here... } Robot是一个接口。那么,如果我想创

我很难弄清楚如何基于给定类型在构造函数中创建新对象

例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本机器人。但是我有另一个构造器,它根据这个参数创建了一个新的机器人

public RobotDriver() {
   this.robot = new BasicRobot();
}

public RobotDriver(Robot robot) {
  //don't know what to do here...
}

Robot
是一个接口。那么,如果我想创建
RobotDriver
,使它的
Robot
是另一种类型,比如
AdvancedRobot
,该怎么办?我需要做一些类型的铸造吗

您可能正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式

工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数


可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式

工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数


可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式

工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数


可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式

工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数


为此,您可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。

为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。

为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。

为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需执行强制转换。

如果只想捕获构造函数参数,可以使用:

public RobotDriver(Robot robot) {
    this.robot = robot;
}
如果要在构造函数中创建参数的副本,有几种可能性。如果您的
Robot
实现都有默认构造函数,则可以执行以下操作:

public RobotDriver(Robot robot) {
    this.robot = robot.getClass().newInstance();
}
否则,您可能会修改
Robot
界面以包含复制功能:

public RobotDriver(Robot robot) {
    this.robot = robot.makeCopy();
}
或者,您可以将
Robot
设置为
Cloneable
类,并修改
Robot
接口,使
clone()
公开(默认情况下受
保护
):

(这基本上是另一个版本的
makeCopy()

最后,应用,您可以定义
RobotDriver
构造函数,将工厂作为参数,或者,对于默认构造函数,具有可设置的静态默认工厂:

public class RobotDriver {
    // basic robots by default
    private static RobotFactory defaultFactory = new BasicRobotFactory();
    private static RobotFactory factory = defaultFactory;

    public RobotDriver() {
        robot = factory.makeRobot();
    }

    /**
     * Change the factory for new instances of RobotDriver
     */
    public static void setFactory(RobotFactory factory) {
        this.factory = factory == null ? defaultFactory : factory;
    }
}

如果只想捕获构造函数参数,可以使用:

public RobotDriver(Robot robot) {
    this.robot = robot;
}
如果要在构造函数中创建参数的副本,有几种可能性。如果您的
Robot
实现都有默认构造函数,则可以执行以下操作:

public RobotDriver(Robot robot) {
    this.robot = robot.getClass().newInstance();
}
否则,您可能会修改
Robot
界面以包含复制功能:

public RobotDriver(Robot robot) {
    this.robot = robot.makeCopy();
}
或者,您可以将
Robot
设置为
Cloneable
类,并修改
Robot
接口,使
clone()
公开(默认情况下受
保护
):

(这基本上是另一个版本的
makeCopy()

最后,应用,您可以定义
RobotDriver
构造函数,将工厂作为参数,或者,对于默认构造函数