2017-09-30 18 views
0

私は、Shapeというスーパークラスを持っています。私のシェイプクラスは、2DShapeというサブクラスを持ち、2DShapeは、circle、squareというサブクラスを持っています。サブクラスからメソッドを呼び出す

私は私の問題は、私は唯一の私のShapeクラスからメソッドを呼び出すことができるということです

Shape [] shapes = new Shape[4]; 

shapes[0] = new Circle(22, 88 , 4, 0); 
shapes[1] = new Square(71, 96 , 0, 10); 

形状のためにこれらのオブジェクト参照を保持するために、Shape型の配列を作成しました。スクエアクラスとサークルクラスからメソッドを呼び出すにはどうすればよいですか?どちらも呼び出されるcalcAreaというメソッドが呼び出されます。私はあなたがShapeのメソッドとしてcalcArea()を定義する必要があります。この

for (int i = 0; i < shapes.length; i++) { 


      System.out.println(shapes[i]); 
      shapes[i].calcArea(); 
} 
+0

ダウンキャスティングを使用できます。 –

+0

ありがとう、私はキャストする必要があるように見える – Carl

答えて

0

をしようとすると、

は、私が「シンボルを見つけることができません」のエラーが表示されます。

public abstract float calcArea(); 

のように、抽象メソッドにすることができます。その場合、各サブクラスでそのメソッドを実装する必要があります。その後、キャストせずにサブクラスShapeから利用可能になります。

+0

これは私が従っている学校の練習です、シェイプクラスはcalcArea()を持つことができません。メソッド – Carl

+0

次に、メソッドを呼び出すには、各オブジェクトを正しい型にキャストする必要があります。エクササイズにエラーがあるか、エクササイズについて何かを理解していないか、または私たちが物事に影響を与えていないその他の情報があります。上のループでは、各シェイプをキャストする必要があるクラスを知る方法がなくても、これをどのようにして合理的に行うのか分かりません。それぞれのオブジェクトを 'instanceof'でテストして、それが特定のクラスであるかどうかを確認することができますが、それは実際には醜いので、多態性の問題では期待されないことが期待されます。 – arcy

+0

私はこれが明白だと考えていましたが、おそらくそうではありません - あなたが記述したときの問題は多形性のためのものです - 各シェイプに 'calcArea( ) 'であるため、スーパークラスはその領域(メソッドシグネチャ)を取得するための「コントラクト」を定義し、すべてのShapeサブクラスにそのメソッドが存在することを保証し、キャスティングは不要です。キャスティングは面倒な操作です。かなりの時間がかかり、継承階層に応じてテストするのが難しいエラーが発生する可能性があります。なぜ私は運動があなたにこれをさせないのか分かりません。 – arcy

関連する問題