繁体   English   中英

如何防止在Java接口中强制转换或制作子级特定方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM