Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
如何在运行时根据construtor参数在超类中创建子类对象(在Java中)_Java - Fatal编程技术网

如何在运行时根据construtor参数在超类中创建子类对象(在Java中)

如何在运行时根据construtor参数在超类中创建子类对象(在Java中),java,Java,我有以下课程和结构(简化版): 公共抽象类AbstractGeoObj{ 私人点位; ... 公开摘要calcArea(); 公共抽象calcPerimeter(); ... 一些吸气剂 ... 一些二传手 ... } 公共类多边形扩展AbstractGeoObj实现InterfaceMove{ 私有链接列表边缘; 公共多边形(链接列表点){ //在这里,我想检查条件并创建正确的对象 //但我认为这样做是错误的 } ... 私有布尔isSquare(列表点){…} 私有布尔isRectangle

我有以下课程和结构(简化版):

公共抽象类AbstractGeoObj{
私人点位;
...
公开摘要calcArea();
公共抽象calcPerimeter();
...
一些吸气剂
...
一些二传手
...
}
公共类多边形扩展AbstractGeoObj实现InterfaceMove{
私有链接列表边缘;
公共多边形(链接列表点){
//在这里,我想检查条件并创建正确的对象
//但我认为这样做是错误的
}
...
私有布尔isSquare(列表点){…}
私有布尔isRectangle(列表点){…}
私有布尔值旋转(列表点){…}
}
公共类矩形扩展多边形实现InterfaceMove{
公共矩形(点a、点b、点c、点d){}
公共矩形(点[]点){this(…)}
公共矩形(链接列表点){this(…)}
...
}
公共类Square扩展多边形实现InterfaceMove{
公共广场(a点、b点、c点、d点){}
公共广场(点[]点){this(…)}
公共广场(链接列表点){this(…)}
...
}
现在的问题是,我需要创建多边形对象、矩形对象或正方形对象,这取决于构造函数参数以及方法isSquare()、isRectangle()和isRotated()在运行时的结果,程序应该自动选择应该创建的对象。例如,如果4个给定点导致isSquare=true和isRotated()=false,我想创建方形对象,如果isRotated()=true,我将始终创建多边形对象

我研究了Builder模式和Factory模式,但我不了解它,因此我无法针对我的问题实施它,我不知道是否有更好的解决方案。一些关于正确方向的建议或提示,可能还有一些例子,可能会对我有很大帮助。我希望你能理解我的问题

我知道矩形和正方形的构造函数基本上是相同的,但这不是这里的主题,我稍后会解决它

这是一个UML图,向您展示了当前的结构,它是德语的,所以我为您翻译了重要的部分。(这不是最终决定,我可以更改):


提前感谢您的帮助。

据我所知,您基本上一直都有一个多边形对象,因此您可以使用一个为您创建多边形对象的工厂。要检查必须使用哪种类型,可以在Polygon类中将方法(isSquare、isRectangle和isRotated)设置为静态。然后工厂使用多边形的具体实现来创建多边形对象:

class PolygonFactory(List<Point> points)
{

  public static Polygon createPolygon(List<Point> points)
  {
    if(Polygon.isSquare(points)
      return new Square(points);
    if(Polygon.isRectangle(points)
      return new Rectangle(points);

    return new Polygon(points);
  }
}
class PolygonFactory(列出点)
{
公共静态多边形createPolygon(列出点)
{
if(多边形isSquare(点)
返回新的方块(点);
if(多边形isRectangle(点)
返回新矩形(点);
返回新多边形(点);
}
}

这是错误的,我认为使用工厂将是最好的方法(),因为构造函数的角色不是决定要创建什么类型的对象,它的角色是创建它应该构造的对象

创建一个类:

class ShapeFactory{
    public static SuperClass getShape(params...){
        if(cond1){return new WhateverSubClass1;}
        else if(cond2){return new WhateverSubClass2;}
        ... (etc for all subclass cases)
    }
}
编辑: 远程参考:

好的,我试过了,看起来它对我有用。我应该把我的答案添加到我的问题中吗?这很好。别忘了选择最佳答案作为“答案”,这样其他人就可以从这篇文章中获得帮助。不,你不必发布解决方案,只需标记最佳答案:)(投票下面有一个复选框)
class ShapeFactory{
    public static SuperClass getShape(params...){
        if(cond1){return new WhateverSubClass1;}
        else if(cond2){return new WhateverSubClass2;}
        ... (etc for all subclass cases)
    }
}