【发布时间】:2010-09-01 19:06:31
【问题描述】:
我有两个 Java 类层次结构,它们共享一个共同的祖先并实现一个共同的接口。我需要将指向这些事物之一的指针传递给另一个类中的方法。
interface I { ... }
class A extends java.awt.Component implements I { ... }
class B extends java.awt.Component implements I { ... }
class D {
Component c;
I i;
void m(? x) {
c = (Component) x;
i = (I) x;
}
}
有什么东西可以替换“?”,让我可以传入“A”或“B”吗?如果我将 'x' 转换为 java.awt.Component 并将其存储在 'c' 和 I 并将其存储在 'i' 中,我将失去强类型的好处。
需要申报吗
class D {
void m(java.awt.Component c, I i) { ... }
}
并用“m(a, a)”或“m(b, b)”在哪里调用它
A a = new A();
B b = new B();
我无法创建
abstract class C extends java.awt.Component implements I {...}
并传递它,因为 A 和 B 都不是 C。
顺便说一句,这可以在 Scala 中完成吗?
编辑:我要解决的实际问题是我有两个类,一个扩展JInternalFrame,另一个扩展JPanel。两者都是抽象的,并为其中显示的小部件(用户可以编辑行、删除行等的 JTables)提供一些通用功能。无论显示的基础对象类型如何,编辑和删除行的代码始终相同。例如,我有几种方法允许用户单击一行,从弹出菜单中选择“删除”,并在要求确认后删除选定的行和数据库对象。有时我需要一个框架子组件,有时需要一个面板子组件。我为通用功能创建了一个委托类,并在该委托类型的每个抽象类中创建了一个实例变量。 JInternalFrame 和 JPanel 派生类然后只是将实际实现推迟到委托。反过来,委托类需要一个指向“所有者”类的指针,用于回调以获取选定的表行等,以及一个指向每个父级的“Component”性质的指针,用于JOptionPane 确认对话框。
使用 Java 泛型方法效果很好。委托类现在被定义为<T extends Component & DelegateContainer 上的泛型类,并且每个所有者抽象类都实现了DelegateContainer(其中声明了回调方法)。
如果我要在 Scala 中重写它,我可能会用特征做一些事情,而不是创建一个委托类。例如,特征可以将删除功能“添加”到JInternalFrame 派生的具体类。
感谢及时回复。
【问题讨论】:
-
A 和 B 都是实现 I 的组件……这需要一个 AbstractIComponent……为什么这对你不起作用?
-
@Arne:我不相信这会起作用,因为
A和B类不是AbstractIComponent类型。
标签: java scala interface multiple-inheritance