これの続編です。
drawだけじゃなくて他でも同様の処理をしたい場合、それぞれでforとswitch文、ましてやキャストを書くのは嫌です。
そういう場合、こんな風にすると良いと思います。
(ついでにFigTypeをint定数じゃなくてenumにしました)
drawだけじゃなくて他でも同様の処理をしたい場合、それぞれでforとswitch文、ましてやキャストを書くのは嫌です。
そういう場合、こんな風にすると良いと思います。
(ついでにFigTypeをint定数じゃなくてenumにしました)
// 図形クラス
class Figure
{
public enum FigType { BOX, LINE };
public abstract int getFigureType();
}
class Box extends Figure
{
private int left, bottom, right, top;
public FigType getFigureType() {
return FIGTYPE.BOX;
}
// 以下、getter/setterなど
}
class Line extends Figure
{
private int x1, y1, x2, y2;
public FigType getFigureType() {
return FIGTYPE.LINE;
}
// 以下、getter/setterなど
}
interface FigureProcessor
{
public void process(Box);
public void process(Line);
}
class FigureManager
{
ArrayList<Figure> figList = new ArrayList<Figure>();
public void processFigures(FigureProcessor processor)
{
for (Figure fig : figList) {
switch (fig.getFigureType()) {
case Figure.FigType.BOX:
processor.process((Box)fig);
break;
case Figure.FigType.LINE:
processor.process((Line)fig);
break;
default:
assert false;
}
}
}
// 以下、Figureの追加メソッドなど
}
// 描画クラス
class Drawer implements FigureProcessor
{
public void process(Box box) {
// 描画処理
}
public void process(Line line) {
// 描画処理
}
}
というようにして、描画させる所では
public void draw() {
figureManager.processFigures(new Drawer());
}
のようにします。