2017-09-30 5 views
0

나는 셰이프라는 이름의 수퍼 클래스를 가지고 있는데, 내 셰이프 클래스는 2DShape라는 하위 클래스가 있고 2DShape에는 circle, square라는 하위 클래스가 있습니다.하위 클래스의 메서드 호출

나는

Shape [] shapes = new Shape[4]; 

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

내 문제는 내가 단지 내 Shape 클래스에서 메소드를 호출 할 수 있다는 것입니다 모양 이러한 객체 참조를 개최 형 모양의 배열을 만들었습니다. 내 Square 클래스와 Circle 클래스에서 메서드를 호출하려면 어떻게해야합니까? 이 두 호출 된 호출 할 싶습니다 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()를 가질 수 없다. method – Carl

+0

그러면 메소드를 호출하기 위해 각 객체를 올바른 유형으로 형변환해야합니다. 운동에 오류가 있거나 운동에 대해 무언가를 이해하지 못하거나 다른 것들에 영향을주는 다른 정보가있는 것 같습니다. 위에있는 루프에서 각 Shape를 캐스팅해야하는 클래스를 알 수있는 방법이 없어도이 작업을 어떻게 합리적으로 수행할지 알 수 없습니다. 각 객체를'instanceof'로 테스트하여 특정 클래스인지 확인할 수 있습니다.하지만 실제로는보기가 어렵습니다. 그리고 다형성을 보여주는 문제에서 기대하지 않기를 바랍니다. – arcy

+0

나는 이것이 분명하다고 생각해 왔지만 아마도 그렇지 않을 것이다. 당신이 묘사 할 때의 문제는 다형성이 무엇인지에 대한 것이다. 각 모양이'calcArea () '이므로 수퍼 클래스는 해당 영역 (메서드 서명)을 얻기위한 "계약"을 정의하여 모든 Shape 하위 클래스에 해당 메서드가 있음을 보장하며 캐스팅은 필요하지 않습니다. 주조는 번거로운 작업입니다. 상당한 시간이 걸릴 수 있으며 상속 계층에 따라 테스트하기가 까다로운 오류가 발생할 수 있습니다. 왜 운동이 너를 막을 지 모르겠다. – arcy