これは厄介な問題であり、デザインがひどいことかもしれません。いくつかの悪いJavaジェネリックを継承しました
単純なグラフコンポーネント(円、棒グラフ、&折れ線グラフ)のセットを書くといくつかのジェネリックスのものに窒息です。事前に、私がここでやろうとしていることを正確に行うための多くのJava APIがあると確信していますが、一般的なジェネリックの問題として興味があります。図表&レポートコンポーネントが含まれているという事実は簡単です。
すべてのチャートは、一般的な抽象基底クラスChart
から継承:
public abstract class Chart<T extends ChartComponent>
{
private List<T> components;
// ...rest of the Chart class
}
すべてのグラフのサブクラスは1+いわゆるチャートコンポーネント(棒、線で構成されますので、我々はT extends ChartComponent
を持っている理由はあります、パイウェッジなど):
public abstract class ChartComponent
{
private Color color;
// .. rest of ChartComponent class
}
public class PieWedge extends ChartComponent
{
double wedgeValue;
// ... rest of PieWedge class
}
は、この設計をまとめる:
0123をこのように、PieChart
は一般的ではなく(また、そうでなければなりません)、常にタイプChart<PieWedge>
です。
バーチャートは棒グラフと棒グラフの設定が同じです(棒グラフは1+棒グラフで構成されており、折れ線グラフは1+線で構成されているため)BarChart extends Chart<BarGroup>
とLineChart extends Chart<Line>
とそれぞれ定義されていました。
今、バーとラインのグラフをさらに抽象化したいと思います。これらのチャートは、実際には、x軸とy軸を持つ(x、y)デカルトグラフに対してプロットされています。これは、そのような軸に対してプロットされていない円グラフとは対照的です。
理想的には、私はChart
を拡張CartesianChart
と呼ばれる新しい抽象クラスを作成し、両方がCartesianChart
を拡張BarChart
とLineChart
を持っていると思いました。この新しいCartesianChart
は、論理的に棒グラフと線グラフに適用され、円グラフには適用されない新しいプロパティ(xAxisLabel
、gridTurnedOn
など)を導入します。
また、それが唯一のタイプBarGroup
又はLine
のchartComponents
(としないPieWedge
)を有することができるようにCartesianChart
を制限するために、私はCartesianComponent extends ChartComponent
ような新しいグラフコンポーネントタイプを作成したい、その後BarGroup
/Line
はそれを延ばすであろう。 Line
はCartesianComponent
を拡張するので
LineChart lineChart = new LineChart();
lineChart.addLine(new PieWedge());
が、PieWedge
はChartComponent
を拡張します。そうすることで、コンパイルから、このようなコードを防止するであろう。
Chart
CartesianChart
BarChart
LineChart
PieChart
ChartComponent
CartesianComponent
BarGroup
Line
PieWedge
PieChart extends Chart<PieWedge>
CartesianChart extends Chart<CartesianComponent>
BarGroup extends CartesianComponent
Line extends CartesianComponent
BarChart extends CartesianChart<BarGroup>
LineChart extends CartesianChart<Line>
この設定に問題がBarChart
とLineChart
の両方で、それはCartesianChart
がジェネリックではないことを訴えてコンパイルエラーを与えることである。このように、私の問題に入る前に、私たちは、次の継承階層を持っています。 これは完全な意味がありますが、私はそれを修正するために何ができるのか分かりません!
私がしようとした場合CartesianChart
を再定義します。
public abstract class CartesianChart<T extends CartesianComponent> extends Chart<CartesianComponent>
{
// ...
}
は、私はすべての私のバー/折れ線グラフのコードから「型の不一致」コンパイルエラーを取得します。エラーの各インスタンスでは、タイプList<CartesianComponent>
の引数が必要ですが、代わりにList<BarGroup>
またはList<Line>
が見つかり、適切な代用品ではないことを示しています。
これは、クラス定義CartesianChart
および/またはCartesianComponent
のどこかのクイックフィックスです。それ以外の場合は、チャートライブラリ全体を再設計する必要があります。いずれにしても、以外にも、のものは「」のようなものに興味があります。ちょっと、JFreeChartsやを試してみてください。繰り返しますが、ここでは、同様のジェネリック問題の広範な解決に関連して、ここでのソリューションに興味があります。これが報告/チャート作成を伴うという事実は自明です。
ご協力いただきありがとうございます!
'Chart'を一般的にすることで何を達成しようとしていますか?言い換えれば、 'class Chart {private Listコンポーネント; } '? –
'public abstract class CartesianChartはグラフ'を拡張しますか? –
digitaljoel
ここに提案していただきありがとうございます。私はここであなたの提案をお試しください。下の私のコメントを参照してください。下のコメントをご覧ください。Chartを拡張することで、TがChartComponentを拡張していないChartのサブクラスを防ぐことができないという私の恐怖についての答えがnicholas.hauschildの答えです。 –
IAmYourFaja