Java 当按下按钮并将其放入dragHandler中时,是否有任何方法可以创建不同子类的新对象?

Java 当按下按钮并将其放入dragHandler中时,是否有任何方法可以创建不同子类的新对象?,java,javafx,polymorphism,Java,Javafx,Polymorphism,我不知道我问的问题是否正确。我正在创建一个类似绘画的应用程序,用户在其中选择一个形状,然后用鼠标拖动在画布上绘制它。我创建了一个超类GeometricObject,子类Line、Rectangle和Eclipse对其进行了扩展。我声明了GeometricObject类型的变量“go”。根据按下的按钮,创建不同子类的新对象并存储在go中。例如,如果按下Eclipse按钮,将创建Eclipse类型的新对象,依此类推。在dragHandler中,如果go变量存储对Eclipse类型对象的引用,则go被

我不知道我问的问题是否正确。我正在创建一个类似绘画的应用程序,用户在其中选择一个形状,然后用鼠标拖动在画布上绘制它。我创建了一个超类GeometricObject,子类Line、Rectangle和Eclipse对其进行了扩展。我声明了GeometricObject类型的变量“go”。根据按下的按钮,创建不同子类的新对象并存储在go中。例如,如果按下Eclipse按钮,将创建Eclipse类型的新对象,依此类推。在dragHandler中,如果go变量存储对Eclipse类型对象的引用,则go被转换为Eclipse类型,并调用Eclipse的draw方法。但在我的情况下,这种逻辑是行不通的

GeometricObject-go;
公共真空吸尘器(MouseEvent MouseEvent){
///transgc是graphicsContext2D
transgc.clearRect(0,0,屏幕宽度,屏幕高度);
ex=mouseEvent.getX();
ey=mouseEvent.getY();
GeometricObject go=新矩形(sx、sy、ex、ey、colorPicker.getValue());
如果(转到行的实例)
((行)开始)。绘制(transgc);
else if(转到Eclipse实例)
((日食)走)。画(transgc);
else if(转到矩形的实例)
((矩形)go)。绘制(transgc);
}
公共虚空日食管理员(行动事件e){
go=neweclipse(sx,sy,ex,ey,colorPicker.getValue());
}
公共无效矩形处理程序(ActionEvent e){
go=新矩形(sx、sy、ex、ey、colorPicker.getValue());
}
公共无效linesHandler(行动事件e){
go=新行(sx、sy、ex、ey、colorPicker.getValue());
}
预期输出-当按下不同的按钮并拖动鼠标时,会绘制不同的形状

GeometricObject go=new Rectangle(sx,sy,ex,ey,colorPicker.getValue());

        if(go instanceof Lines)
            ((Lines)go).draw(transgc);
        else if(go instanceof Eclipse)
            ((Eclipse)go).draw(transgc);
        else if(go instanceof Rectangle)
            ((Rectangle)go).draw(transgc);
实际输出-拖动鼠标时不会绘制任何内容

GeometricObject go=new Rectangle(sx,sy,ex,ey,colorPicker.getValue());

        if(go instanceof Lines)
            ((Lines)go).draw(transgc);
        else if(go instanceof Eclipse)
            ((Eclipse)go).draw(transgc);
        else if(go instanceof Rectangle)
            ((Rectangle)go).draw(transgc);

在这里,您总是创建一个矩形对象“go”。它应该省略。

你为什么要投?这不是使用多态性的方式。您只需在对象上调用
go.draw()
,而无需使用if和casting。