动态投射对象

时间:2018-06-22 15:37:18

标签: java object casting

我目前正在使用JavaFx。我需要制作形状,然后添加一个click事件,这将打开一个新窗口,该窗口将接受输入以更改形状的大小。 我有一个父类“ MShape”和子类“ MRectangle”,“ MCircle”,“ MEllipse”等。 我有一个方法可以多态地创建这些形状,因此它们的类型为MShape。这是多态代码。

npm version

现在,当我在另一个类中调用此函数时,我希望能够将MShape转换为相应的形状。例如,我想制作一个循环,例如将第一个索引MRectangle转换为MRectangle。但是,当我需要从MRectangle更改为MEllipse时,我不想使用if-else语句。那我该怎么投呢?

这是我尝试的方式:

 public static MShape[] getDefaultShapes(){
    MShape[] allshapes= new MShape[7];
    allshapes[0] = new MRectangle( 255, 125, 30, 25);
    allshapes[1] = new MRectangle( 155, 75, 10, 40);
    allshapes[2] = new MCircle( 80, 80, 10);
    allshapes[3] = new MRectangle( 45, 105, 80, 40);
    allshapes[4] = new MCircle( 200, 100, 50);
    allshapes[5] = new MSquare (150, 200, 70);
    allshapes[6] = new MEllipse (50, 210, 30, 50);
    return allshapes;
}

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说,相当有可能在循环中将其强制转换回原始类型。这表明browser = webdriver.Firefox()没有完成任务。我待会儿再讲这个,但首先:

  

我不想使用if-else语句

这是您唯一的选择(MShape或其他类似的控制流分支机制),如果您确实要表示要 cast ,请返回到对象类型他们指的是。而且这将是一组相当丑陋的分支。

回到if未完成其工作。在不知道为什么要回退的情况下,无法确定地说不出来,但是例如假设问题是您要渲染形状,并且需要在某个渲染器上使用不同的方法来进行渲染。 :

MShape

相反,让// DON'T DO THIS for (MShape shape in shapes) { if (shape instanceof MRectangle) { renderer.renderRectangle(/*...*/); } else if (shape instanceof MEllipsis) { renderer.renderEllipse(/*...*/); } // etc. } 提供接受渲染器的抽象MShape方法:

render

...然后让具体的类适当地实现它:

public abstract void renderTo(Renderer renderer);

等等然后您的循环是:

// In MRectangle
public abstract void renderTo(Renderer renderer) {
    renderer.renderRectangle(/*...*/);
}

// In MEllipse
public abstract void renderTo(Renderer renderer) {
    renderer.renderEllipse(/*...*/);
}

值得注意的是,for (MShape shape in shapes) { shape.renderTo(renderer); } 应该是一个接口,以便您的类可以支持多种不同类型的目标渲染器。