【发布时间】:2012-09-10 05:46:27
【问题描述】:
我是一名 C++ 程序员,在 C++ 中我可以做这样的事情:
class SuperSuper
{
virtual void newItem()=0;
}
class SubSuperA:public SuperSuper
{
virtual void newItem()
{
//do something
}
}
class SubSuperB:public SuperSuper
{
virtual void newItem()
{
//do something different (disappear! :)
}
}
template <class T>
class SubSub:public T
{
virtual void newItem()
{
T::newItem();
//do a third thing
}
}
我想在 Java 中做到这一点,但是我感觉它(至少直接)是不可能的
我在 Java 中轻松设置了前三个类,如下所示:
public abstract class SuperSuper
{
abstract void newItem(Item item);
}
public class SubSuperA extends SuperSuper
{
@Override void newItem(Item item)
{
//stuff
}
}
public class SubSuperB extends SuperSuper
{
@Override void newItem(Item item)
{
//other stuff
}
}
//SubSuperC,D,etc
目前正在像这样实施第四个:
SubSuperA sa=new SubSuperA() {
@Override public void newItem(Item item)
{
super.newItem(item);
//A lot of stuff that will be changing constantly throughout development
}
};
SubSuperB sb=new SubSuperB() {
@Override public void newItem(Item item)
{
super.newItem(item);
//A lot of stuff that will be changing constantly throughout development
}
};
请注意,这两个覆盖具有相同的功能。无论它基于什么 SubSuper*,替换 newItem() 都是相同的。显然,这将是一场噩梦。我希望我可以像这样声明一个 SubSub 类
public class SubSub<T> extends T {
@Override public void newItem(Item item)
{
super.newItem(item);
//A lot of stuff that will be changing constantly throughout development
}
}
我可以像这样实例化
SubSub ss=new SubSub<SubSuperA>
等等...但是java中的这个错误:
"Cannot refer to the type parameter T as a supertype."
我根据该错误环顾四周,发现 Extend from Generic Supertype? 声称使用该方法无法实现我想要做的事情。
我真正需要做的:我有一个与平台无关的推特客户端,它只处理接收推文、存储推文等。它有一个抽象的列类 (SuperSuper),我可以为各种不同类型的列 (SubSuper) 扩展它(主页时间线、提及等),并且每个都过滤掉他们想要在 newItem() 中显示的推文。我希望能够为不同的平台插入各种 GUI,并且我需要客户端调用 GUI 特定函数 (SubSub) 来处理将每个单独的推文添加到 GUI 库。拥有一个可以扩展任何 Column 派生类的 GUI 特定类将是理想的解决方案
由于显然这种直接实现在 Java 中是不可能的,我想知道是否有一些语法技巧可以实现相当相似的东西,或者我是否应该创建一个接口,该接口将由 SuperSuper 存储和调用SuperSub* 并由我的 GUI 处理程序而不是 SubSub 实现。
【问题讨论】:
-
那么,你有一个类 A,类 M 和 P 派生自(扩展)A,有什么转折? (只要将A类定义为abstract就可以将A中的方法定义为abstract,这将需要非抽象的M和P类来实现该方法)
-
我可以很好地定义 M 和 P。问题是我想制作可以在实例化时扩展 A、M 或 P 的 SubSub。在我的 java 实现中,它已经定义了 A、M 和 P 并且正在工作,包括所有抽象的东西
-
嗯,我很确定你不能这样做——你能多谈谈你的用例吗?例如,如果您只想保证 A、M、P 和 Z(您的“SubSub”)都可以实现一个通用接口,这将保证定义的规范方法可用。
-
M,P 和未知数量的其他类扩展 A(或实现 A 等,我很灵活),我希望能够编写 Z(它覆盖 A 中的一个函数(因此是 MP))(或只是 newItem())一次,然后当我执行 new M() 或 new P() 时能够覆盖 MP 中的 newItem
-
我希望您可以用更具体的内容更新您的问题。您所说的抽象继承不太可能是不可能的。您不能在运行时扩展任意类(= Java 中的实例化)。您可以通过称为动态代理的东西为接口提供运行时实现(包括将多个接口拼接在一起,但不会有层次关系)。
标签: java generics inheritance multiple-inheritance