[英]How do I prevent a cast or making child specific methods in the interface in java?
我在保持代码可维护性方面遇到问题。 在我的问题中,我定义了一个“ RenderableShape”,它是2D和3D形状的父接口(这两个是接口)。
我有一个Renderer类,它“请求”一个RenderableShape
来呈现数据。
3D形状应返回环绕其的一些数学公式或对象,而2D形状应返回其组成的所有2D形状(三角形,圆形等)。
显然,“ RenderableShape”不能同时返回两种类型的渲染器。
我可以使用两种不同的方法,但这将迫使所有实现都实现一种无用的方法。
渲染器还可以要求形状是什么样的形状,但是之后您将需要强制转换,这不仅是不必要的,而且在渲染时使用起来也太慢。
此外,渲染代码本身不应该是形状,因为我希望所有渲染代码都在渲染器中,以允许使用不同的渲染器类型(Z-Buffer,raytracer等)。
解决此问题的方法将是一种可维护且极为有效的方法?
解决此问题的方法将是一种可维护且极为有效的方法?
在这里应该应用的OOP原则之一就是告诉,不要问!
将渲染器传递到RenderableShape
然后将其自身绘制到渲染器。
首先,您甚至不应该考虑从接口“删除”方法。 如果可以在超类上调用foo(),则Liskov替换原则指出,您还需要foo()也必须存在于派生类上。 其他任何事情都明显违反了OOP应该如何工作。
因此,您应该遵循已经给出的答案。 不要要求形状告诉渲染器要做什么-而是启用每个形状来渲染自身(通过将渲染器传递给形状)。
尝试进一步分解您的任务,什么是形状? 它是在某些显示位置上的曲线和线的集合。 如何制作类似简单api的东西呢? 进行渲染以写入线,曲线,点等。
interface Render {
renderLine(Formula formula);
renderCurve(Formula formula);
renderDot(Formula formula);
}
之后,创建Shape以获得Render实例并通过此api编写自己。 Shape知道自己需要写多少点,线等。 公式是表示数学公式的界面。 当您需要更复杂的对象时,请进一步进行“渲染”以渲染简单的三角形,正方形等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.