【问题标题】:Inheritance in Java: naming collision caseJava中的继承:命名冲突案例
【发布时间】:2018-06-01 13:28:04
【问题描述】:

这个问题不仅是关于 Java 的,也是关于另一种面向对象的语言的。我设计了一个简单的 UI 库,它有一个名为 Drawer 的特殊接口,其中包含用于在某些图形表面上绘制控件和基元的抽象方法,我们可以在其中设置像素。它旨在构建在一些简单的图形平台之上。就目前而言,我使用 AWT 绘图引擎。 问题是我创建了类AWTDrawer,它扩展了java.awt.Canvas 并实现了Drawer,这是一个命名冲突:两个祖先都有SetColorgetColordrawLine 方法。如何确定我要使用什么祖先的方法?

【问题讨论】:

  • 创建接口时,最好以 I 开头名称,这样您一眼就知道它是一个接口(例如 IDrawer)。
  • 如果AWTDrawer 扩展 java.awt.Canvas,那么后者必须是一个类。除非方法的签名相同,否则如果您的实例声明为 Drawer 类型应该没问题。

标签: java oop inheritance multiple-inheritance library-design


【解决方案1】:

这通常是您的设计中的一个错误。

根据您的描述,您通过扩展在 Drawer 类和 java.awt.Canvas 类之间实现了 is a 关系。

您似乎确实想要关系。

要解决这个问题,不要扩展 java.awt.Canvas,而是保留一个本地 Canvas 实例变量并在您的 Drawer 类中使用它。

【讨论】:

  • 谢谢你的好主意,我是这样做的。它看起来比内在更优雅。
【解决方案2】:

我会使用来自所选祖先的完整限定名称来做到这一点。

而不仅仅是调用

方法名

你可以试试:

java.package.subpackage.class.method

其他语言,如 C#,同样的想法,但他们称之为命名空间

【讨论】:

  • 很遗憾,Java 将此类方法调用视为调用静态方法,但由于没有此类静态方法,因此找不到此类方法。
猜你喜欢
  • 2015-04-19
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2011-11-20
相关资源
最近更新 更多