我无法弄清楚如何根据给定的类型在构造函数中创建新对象。
例如,我有一个机器人驱动程序,它有一个默认的构造函数,它不带参数并创建一个基本的机器人。但是我有另一个构造函数,它根据参数创建一个新的机器人。
public RobotDriver() {
this.robot = new BasicRobot();
}
public RobotDriver(Robot robot) {
//don't know what to do here...
}
Robot
是一个界面。那么,如果我想创建RobotDriver
以使其Robot
属于AdvancedRobot
之类的其他类型,该怎么办?我需要做某种类型的铸造吗?
答案 0 :(得分:2)
可能你正在寻找一个可以创建任何机器人类型对象的类:RobotDriver / AdvanceRobot等。如果是,那么你需要研究工厂设计模式。
Factory Pattern from Wikipedia
工厂方法模式是使用工厂的创建模式 处理没有创建对象的问题的方法 指定将要创建的对象的确切类。这是 通过调用工厂方法创建对象来完成 - 指定 在一个接口中,由子类实现,或在一个 基类,并可选择由派生类重写,而不是由 调用构造函数。
答案 1 :(得分:1)
如果您只想捕获构造函数参数,可以使用:
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()
公开(默认情况下为protected
) :
public RobotDriver(Robot robot) {
this.robot = robot.clone();
}
(这基本上是makeCopy()
的另一个版本。)
最后,应用Juned Ahsan's answer,您可以定义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;
}
}
答案 2 :(得分:0)
为此,您可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后,您可以使用多态http://www.tutorialspoint.com/java/java_polymorphism.htm。然后,您将理想地在新创建的AdvancedRobot类中创建逻辑以封装AdvancedRobot。如果你正确设置它,你将不需要进行投射。