#様々な図形の面積を求めるいくつかのインスタンスを別のクラスで番号をつけてランダムに実行するプログラムが描きたいです。
サブクラスはそれぞれRectangle,Circle1,Triangle,Squareです。
##スーパークラスは以下の通りに作りました。
java
package object; public abstract class Figure { double area = 0; abstract double getArea(); abstract void identify(); final String name; public Figure(String name) { this.name = ""; } public Figure(){ this.name = ""; } @Override public String toString() { return name + ":" + String.format("%.1f", getArea()); } }
###これらのサブクラスをFiguresというクラスに入れてランダムに面積をコンソールに表示したいです。
java
package object; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; public class Figures{ public static void main(String[] args) { Figure[] figures1 = new Figure[8]; Figure[] figures2 = figures1.clone(); Figure temp; Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(30, 20); int i = 0; figures1[i++] = r1; figures1[i++] = r2; Circle1 c1 = new Circle1(); Circle1 c2 = new Circle1(25); figures1[i++] = c1; figures1[i++] = c2; System.out.println("The area of c1 is" + c1.getArea()); System.out.println("The area of c2 is" + c2.getArea()); Triangle t1 = new Triangle(); Triangle t2 = new Triangle(30, 20); Triangle t3 = new Triangle(300, 200); System.out.println("The area of t1 is" + t1.getArea()); System.out.println("The area of t2 is" + t2.getArea()); System.out.println("The area of t3 is" + t3.getArea()); figures1[i++] = t1; figures1[i++] = t2; figures1[i++] = t3; Square2 s1 = new Square2(); Square2 s2 = new Square2(20); System.out.println("The area of s1 is " + s1.getArea()); System.out.println("The area of s2 is " + s2.getArea()); figures1[i++] = s1; figures1[i++] = s2; Figure[] cloneShuffle;Figure[] figures;{ Figure[] result = figures.clone(); Random rnd = ThreadLocalRandom.current(); for (int k = result.length - 1; k > 0; k--) { int index = rnd.nextInt(k + 1); Figure temp1 = result[index]; result[index] = result[k]; result[k] = temp1; } return; } for(i=0;i<figures2.length;i++) { System.out.println(figures2[i].getClass().getName()+":"+figures2[i].getArea()); } } ///図形の説明 class Figure{ int count = 0; double area =0; double getArea() { return 0; } } class Rectangle extends Figure{ int width; int height; String name="Rectangle"; Rectangle(){ setSize(10,20); } Rectangle(int width,int height){ setSize(width,height); } void setSize(int w,int h) { width=w; height=h; } double getArea() { return width*height; } } class Circle extends Figure{ int r; String name="Circle"; Circle(){ setSize(5); } Circle(int r){ setSize(r); } void setSize(int r){ this.r=r; } double getArea() { return r*r*Math.PI; } } }
####このコードを実行すると、
figures1[i++] = r1;
figures1[i++] = r2;
は格納されるのですが、残りのCircle1,Triangle,Squareがうまく格納されず「型の不一致: Circle1 から Figures.Figure には変換できません」というエラーメッセージが表示されてしまいます。
RectangleのコードとCircle1のコードは以下のように描きました。
java
package object; import java.util.concurrent.atomic.AtomicInteger; public class Rectangle extends Figure { private double height = 0; private double width = 0; static final String NAME = Rectangle.class.getSimpleName(); static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); Rectangle(){ this.width = 20; this.height = 10; } Rectangle(double w, double h){ this.width = w; this.height = h; } void setWidth(double w) { this.width = w; } void setHeight(double h) { this.height = h; } void setSize(double w, double h) { setWidth(w); setHeight(h); } double getWidth() { return this.width; } double getHeight() { return this.height; } Rectangle(int width, int height){ super(NAME + counter.addAndGet(1)); this.width = width; this.height = height; } @Override double getArea() { return width * height; } void identify() { System.out.println("I am a rectangle with area" + getArea() + "."); } }
java
package object; import java.util.concurrent.atomic.AtomicInteger; public class Circle1 extends Figure { private double radius = 0; static final String NAME = Rectangle.class.getSimpleName(); static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); Circle1(){ this.radius = 20; } void Circle(double r){ this.radius = r; } void setRadius(double r) { } void setSize(double r) { setRadius(r); } double getRadius() { return this.radius; } Circle1(int r){ super(NAME + counter.addAndGet(1)); this.radius = r; } @Override double getArea() { area = Math.PI * this.radius * this.radius; return area; // TODO 自動生成されたメソッド・スタブ } void identify() { System.out.println("I am a Circle1 with area" + getArea() + "and" + getNumber() + "."); // TODO 自動生成されたメソッド・スタブ } private String getNumber() { // TODO 自動生成されたメソッド・スタブ return null; } @Override void iduntify() { // TODO 自動生成されたメソッド・スタブ } }
型の不一致というエラーはStringとintの時によくみられるエラーですが、今回私は全てint型で書いているつもりで、なぜRectangleは実行できたのに他のものが実行できなかったのかがわかりませんでした。試しにRectangleとCircleの順を変えてみたのですが結果は同じでした。
初心者で理解が甘い部分があるかと思います。何かわかるかたがいらっしゃいましたらご回答をお願いします。
まだ回答がついていません
会員登録して回答してみよう