我是一名 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."
我根据该错误环顾四周,发现从通用超类型扩展?它声称使用该方法无法实现我想要做的事情。
我真正需要做的:我有一个与平台无关的推特客户端,它只处理接收推文、存储推文等。它有一个抽象的列类(SuperSuper),我可以为各种不同类型的列(SubSuper)扩展(家庭时间线,提及等),并且每个过滤掉他们想要在 newItem() 中显示的推文。我希望能够为不同的平台插入各种 GUI,并且我需要客户端调用 GUI 特定函数 (SubSub) 来处理将每个单独的推文添加到 GUI 库。拥有一个可以扩展任何 Column 派生类的 GUI 特定类将是理想的解决方案
由于显然这种直接实现在 Java 中是不可能的,我想知道是否有一些语法技巧可以实现相当相似的东西,或者我是否应该创建一个接口,该接口将由 SuperSuper 和 SuperSub* 存储和调用由我的 GUI 处理程序而不是 SubSub 实现。