私はつまり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で最初の3つのクラスを簡単に設定します。
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
そして現在、そのように4番目を実装しています:
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."
私はそのエラーに基づいて周りを見回し、Generic Supertypeからの拡張を見つけましたか?これは、私がやりたいことはその方法では不可能だと主張しています。
私が実際に行う必要があること:ツイートの受信や保存などを処理するだけのプラットフォームに依存しないTwitterクライアントがあります。さまざまな種類の列(SubSuper)に拡張できる抽象Columnクラス(SuperSuper)があります(ホームタイムライン、メンションなど)、それぞれがnewItem()に表示するツイートを除外します。さまざまなプラットフォーム用にさまざまなGUIをプラグインできるようにしたいので、クライアントがGUI固有の関数(SubSub)を呼び出して、個々のツイートをGUIライブラリに追加する処理を行う必要があります。任意のColumn派生クラスを拡張できるGUI固有のクラスを持つことが理想的なソリューションになります
どうやらこの直接実装はJavaでは不可能なので、かなり似たようなものを実現する構文上のトリックがあるのか、それともSuperSuperとSuperSub*によって保存および呼び出されるインターフェイスの作成をやめるべきなのか疑問に思います。 SubSubの代わりにGUIハンドラーによって実装されます。