2

この「コンテナ問題」をJavaで解決しなければなりません。さまざまな数値で構成された配列があり、次のコードを機能させたいです。

 package container;
    class Figure{
        public void draw() {}
        public String getColor() { return null; }
    }

    class Square extends Figure{
        @Override
        public void draw(){
            System.out.println("Square");
        }
    }

    class Circle extends Figure{
        @Override
        public void draw(){
            System.out.println("Circle");
        }
        public float getRadius(){
            return 8;
        }
    }

    public class Container {

        public static void main(String[] args) {

            Figure[] figures = new Figure[3];
            figures[0]= new Circle();
            figures[1]= new Circle();
            figures[2]= new Square();

            for(Figure figure:figures){
                figure.getColor();
                figure.draw(); 
                ((Circle) figure).getRadius();          
            }        
    }
}

Squareメソッドがないため、問題があることがわかりますgetRadius()。次の制限があります。

  • ジェネリックは使えない
  • 使えないinstanceof

これは、優れたオブジェクト指向設計ソリューションである必要があります。

4

5 に答える 5

1

enum FigureType子クラスを識別する を基本クラスに追加してみませんか?

public static enum FigureType {

    Square,
    Circle
}

public static class Figure {
    private FigureType type;

    public Figure(FigureType type) {
        this.type = type;
    }

    public FigureType getType() {
        return type;
    }

    public void draw() {
    }

    public String getColor() {
        return null;
    }
}

で親クラスのコンストラクターを呼び出す各子クラスに、デフォルトのコンストラクターを追加する必要がありますFigureType

public static class Square extends Figure {

    public Square() {
        super(FigureType.Square);
    }

    @Override
    public void draw() {
        System.out.println("Square");
    }
}

public static class Circle extends Figure {

    public Circle() {
        super(FigureType.Circle);
    }

    @Override
    public void draw() {
        System.out.println("Circle");
    }

    public float getRadius() {
        return 8;
    }
}

使用法:

public static void main(String[] args) {

    Figure[] figures = new Figure[3];
    figures[0] = new Circle();
    figures[1] = new Circle();
    figures[2] = new Square();

    for (Figure figure : figures) {
        figure.getColor();
        figure.draw();
        if (figure.getType() == FigureType.Circle) {
            ((Circle) figure).getRadius();
        }
    }
}

結果:

Circle
Circle
Square

例外なし

于 2015-08-06T13:01:34.757 に答える
0

のすべてのタイプで機能するコードを記述し、がまたはFiguresの場合は異なる動作が必要です。これが、彼らがポリモーフィズムを発明した理由です。コードは次のようになります。FigureCircleSquare

Figure f;
if (f is Circle) {
  doFoo();
} else {
  doBar();
}

代わりに、これを行うより良い方法は次のとおりです。

interface Figure {
  public void do();
}

class Circle implements Figure {
  public void do() {
    doFoo();
  }
}

class Square implements Figure {
  public void do() {
    doBar();
  }
}

次に、コードは次のようになります。

Figure f;
f.do();
于 2015-08-06T12:45:46.777 に答える
0

try/catch を使用して ClassCastException の防止を試すことができます。

try {
   ((Circle) figure).getRadius();
} catch(ClassCastException e) { 
    //does nothing 
} 
于 2015-08-06T12:34:30.330 に答える
0

を使用できない場合はinstanceof、クラスで抽象メソッドを宣言し、Figureそれを必要としない図のダミー実装を追加できます。instanceofおよび Java ジェネリックを使用しない次のコードは機能します。

package container;

abstract class Figure {
    public void draw(){};
    public String getColor(){return null;};

    protected abstract float getRadius();
}

class Square extends Figure{
    @Override
    public void draw(){
        System.out.println("Square");
    }

    // zero radius for non-circle figures, for instance
    // or you can throw UnsupportedOperationException here.
    public float getRadius() { return 0;} 
}

class Circle extends Figure{
    @Override
    public void draw(){
        System.out.println("Circle");
    }
    public float getRadius(){
        return 8;
    }
}

public class Container {

    public static void main(String[] args) {

        Figure[] figures = new Figure[3];
        figures[0]= new Circle();
        figures[1]= new Circle();
        figures[2]= new Square();

        for(Figure figure:figures){
            figure.getColor();
            figure.draw(); 

            figure.getRadius();
        }        
    }
}
于 2015-08-06T12:27:46.990 に答える