1 回答
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应该是一个接口,以便您的类可以支持多种不同类型的目标渲染器。
添加回答
举报