基本的なOOPの概念の理解に問題があります。私はそれを例で説明しようとします。いろいろな形の図形を描くアプリケーションがあるとしましょう。OOPで図階層を実装する方法
私はFigureクラスを作成し、フィールドShapeを追加します(これは列挙の一種であり、Shape.CircleまたはShape.Squareでもかまいません)。
public class Figure {
public Shape shape;
public void draw() {
if(shape == Shape.Square)
// draw a square
else if(shape == Shape.Circle)
// draw a circle
}
}
アプリケーションにさらにシェイプを追加する必要がある場合は、if()メソッドを追加する必要があります。私はそれが悪いと思う。
図形クラスを抽象的な(またはそれをインタフェースにして)作成し、このクラスから具体的な図形を継承し、draw()メソッドをオーバーライドすることができます。
public abstract Figure { void draw(); }
public class Circle extends Figure {
@Override public void draw() {
// draw a circle
}
}
// same for Square
私は新しい形を追加するだけで新しいクラスを追加します。
次のように、私は私の人物の色を黒または白にしたいと決めました。黒い正方形と白い四角形を別々に描画する必要があります。問題は同じように見えます。私は、Figureクラスにカラーフィールドを追加し、それぞれの描画メソッドでifを処理したり、BlackCircle、BlackSquare、WhiteCircle、WhiteSquareのようなクラスを作成することができます。
後でFigureの別のプロパティを追加することにした場合(SizeはSmall、Medium、Large)、BigBlackCircle、SmallWhiteSquareなどの2 * 2 * 3クラスを作成する必要があります。また、実行時にFigureの色や形を変更することはできません。私はそれが正しい方法ではないと思う。
問題を理解しようとすると、私はまだすべての人物のために単一のクラスを持つことができることがわかりました。次に、色、形状、サイズをフィールドとして保存し、描画を担当する種類のDisplayManagerクラスを追加します。私は異なる描画アルゴリズムのためにDisplayManagerの異なる実装を持つことができます。
public class Figure {
public Shape shape;
public Color color;
public Size size;
public DisplayManager display;
public void draw() {
display.draw(this);
}
}
public class DisplayManager {
public void draw(Figure figure) {
// drawing based on figure's shape, color and size
}
}
しかし、この方法では、手順1の問題に戻ります。draw()メソッドで多くのifを処理する必要があります。誰でもここで正しい方法を説明できますか?アプリケーションの柔軟性を節約するために、クラスをどのように設計する必要がありますか?
ありがとうございました。私はGoFのデザインパターンでほぼ同じソリューションを見つけました。 – Soteric