为了账号安全,请及时绑定邮箱和手机立即绑定

动态投射对象

动态投射对象

青春有我 2021-03-29 16:42:16
我目前正在使用JavaFx。我需要制作形状,然后添加一个click事件,这将打开一个新窗口,该窗口将接受输入以更改形状的大小。我有一个父类“ MShape”和子类“ MRectangle”,“ MCircle”,“ MEllipse”等。我有一个方法可以多态地创建这些形状,因此它们的类型为MShape。这是多态代码。 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;}现在,当我在另一个类中调用此函数时,我希望能够将MShape转换为相应的形状。例如,我想制作一个循环,例如将第一个索引MRectangle转换为MRectangle。但是,当我需要从MRectangle更改为MEllipse时,我不想使用if-else语句。那我该怎么投呢?这是我尝试过的方法:public static void control(int index){MShape[] shapes = MAllShapes.getDefaultShapes();String shapeName=shapes[index].getClass().getSimpleName();shapeName castedObject=(shapeName) shapes[index]System.out.println(myShape.getName());}
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

正如我在评论中说的那样,很可能会在循环中将其强制转换回原始类型。这表明那MShape没有做。一会儿,我会回到这个话题,但首先:


我不想使用if-else语句


那是你唯一的选择(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);

}

值得注意的是,它Renderer应该是一个接口,以便您的类可以支持多种不同类型的目标渲染器。


查看完整回答
反对 回复 2021-04-21
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信