2015-11-12 9 views
7

これについてクリーンなタイトルを思いついても、難しい課題です。Listで抽象ジェネリッククラスを定義する<?>メンバー

基本的な考え方は、「親」を参照するメンバーを持つ「子」アイテム用と、子オブジェクトを含む「親」リスト用に2つのスーパークラスを定義することです。 child-> parentとparent-> childからのリンクは対称です。親/子スーパークラスのそれぞれには、追加の機能を定義し実装するサブクラスがあります。親との子ペアには常にパラレルサブクラスがあります。つまり、親は子参照のみを含み、子は親を参照するだけで、サブタイプ間には「交差」はありません。

これはどのように表現できますか?私は数日間このことに固執しており、より創造的なのは、それが悪化すると、複数レベルのネストされたジェネリック型であることです。これは私がしたいことです:

abstract class ChildBase<T extends ChildBase<T>> { 
ParentBase<T> parent; 
} 
abstract class ParentBase<T extends ChildBase<T>> { 
LinkedList<T> childList; 
} 
class ChildSub extends ChildBase<ChildSub> { 
// ... class specific stuff 
} 
class ParentSub extends ParentBase<ChildSub> { 
// ... class specific stuff 
} 

これは混乱です。私はこれを行うのがはるかに簡単で、簡単な方法があると思うし、それはおそらく全く異なる方向にあるだろう。

+0

なぜ 'T 'が' ChildBase'を拡張する必要があるのか​​知りたいですか?それらのクラスには、「ChildBase」である必要があるメソッドがいくつか存在するでしょうか?ノードの兄弟を取得することが一例です。そうでなければ構造を大幅に簡素化することができます。 – sprinter

+0

@sprinterは、おそらくより良いデザインを提供するために、問題のドメインを深く理解する必要があると述べています。記述されたクラスのアプリケーションの詳細についてさらに検討してください。 – guilhermerama

+1

継承の代わりにインターフェイスベースのソリューションを試してみましたか?個人的には、クラスをデカップリングするだけではなく、これらの問題の多くが解決しやすいことが分かりました。 – Acapulco

答えて

0

class ParentSub extends ParentBase<ChildSub>を意味しましたか?

これを変更すると、すべてがコンパイルされます。

これは混乱です。私はこれを行うのがはるかに簡単で、簡単な方法があると思うし、それはおそらく全く異なる方向にあるだろう。

実際、私がジェネリックスを使用したことを見た他の方法のいくつかと比較すると、これはまったく悪くありません。これを達成する根本的に異なる方法はありません。

ChildBaseParentBaseを非ジェネリックにする必要がある場合にのみキャストを使用することです(これは真剣に検討する必要があります)。プログラマが正しいタイプセーフなプログラムを書くのを助けるためにジェネリックスが言語に導入されました。クラス間で複雑な関係や循環的な関係がある場合、ジェネリックを正しく使用する方法を理解するのは非常に困難で時間がかかるので、それらをまったく使用することのメリットはありません。

+0

はい、クラスの外側にキャストするのではなく、サブクラスに型固有のコンテンツを追加することに夢中になりました。私が見ているトレードオフはメンテナンスです。変更が必要な場合は、必要に応じてすべてのサブクラスに確実に伝達されるようにするためにもっと勤勉にする必要があります。サイクリック/ネストされたジェネリックアプローチを実行するのに費やす時間が無駄であり、とにかく変更する必要があるたびに壊れやすいコードが生成される可能性があります。 – ags

+0

@agsパターン 'MyClass >'の問題(非常に混乱している点を除けば)は、継承とまったく混合しないので非常に制限的です。 (http://stackoverflow.com/questions/33632871/how-to-implement-container-element-classes-by-using-type-parameters)。'ChildSub'を拡張することを将来決定した場合、型パラメータを' ChildSub'として固定しているので、さらに悪い問題に直面します。 –

関連する問題