Java 中的继承:命名冲突案例
Inheritance in Java: naming collision case
这个问题不仅仅是关于Java,它也是关于另一种面向对象的语言。我设计了简单的 UI 库,它有一个名为 Drawer
的特殊接口,它包含用于在我们可以设置像素的某些图形表面上绘制控件和基元的抽象方法。它旨在建立在一些简单的图形平台之上。现在我使用 AWT 绘图引擎。
问题是我创建了 class AWTDrawer
,它扩展了 java.awt.Canvas
并实现了 Drawer
,这是一个命名冲突:两个祖先都有 SetColor
、getColor
, drawLine
方法。我怎样才能确定我想使用哪个祖先的方法?
这通常是您设计中的错误。
根据您的描述,您在 Drawer
class 和 java.awt.Canvas
class 之间实现了 是 关系扩展它。
看来您确实想要 有 关系。
要解决这个问题,不要扩展 java.awt.Canvas
,而是保留一个本地 Canvas
实例变量并在您的 Drawer
class.
中使用它
我会使用来自所选祖先的完全限定名称来完成。
而不是只调用
methodName
你试试这样的:
java.package.subpackage.class.method
其他语言,如 C#,同样的想法,但他们称之为命名空间
这个问题不仅仅是关于Java,它也是关于另一种面向对象的语言。我设计了简单的 UI 库,它有一个名为 Drawer
的特殊接口,它包含用于在我们可以设置像素的某些图形表面上绘制控件和基元的抽象方法。它旨在建立在一些简单的图形平台之上。现在我使用 AWT 绘图引擎。
问题是我创建了 class AWTDrawer
,它扩展了 java.awt.Canvas
并实现了 Drawer
,这是一个命名冲突:两个祖先都有 SetColor
、getColor
, drawLine
方法。我怎样才能确定我想使用哪个祖先的方法?
这通常是您设计中的错误。
根据您的描述,您在 Drawer
class 和 java.awt.Canvas
class 之间实现了 是 关系扩展它。
看来您确实想要 有 关系。
要解决这个问题,不要扩展 java.awt.Canvas
,而是保留一个本地 Canvas
实例变量并在您的 Drawer
class.
我会使用来自所选祖先的完全限定名称来完成。
而不是只调用
methodName
你试试这样的:
java.package.subpackage.class.method
其他语言,如 C#,同样的想法,但他们称之为命名空间