2014-07-22 3 views
0

나는 추상 클래스 C0을 가지고있다. C0에서 상속받은 몇 가지 다른 클래스가 있습니다. 그것들은 추상적 인 메소드를 오버라이드하고 그들 자신의 특별한 메소드를 가진다.추상 클래스의 ArrayList 사용

이러한 특수 클래스를 모두 포함하는 ArrayList를 만들고 싶습니다. 나는이 ArrayList를 통해 C1의 및 C2 자신의 메소드를 호출 할 수 있도록하고 싶습니다

ArrayList<C0> A = new ArrayList<>(); 
A.add(new C1()); 
A.add(new C2()); 

A.get(x).method_of_C0(); // Works because my classes extend C0. 
A.get(0).method_of_C1(); // Does not work 
A.get(1).method_of_C2(); // Does not work 

: 여기

내가 (원하는) 어떻게하는지 보여주는 코드의 덩어리입니다. 그게 가능할까요? 나는 수동으로 캐스팅하여 몇 가지 조작을 시도했지만 성공하지 못했습니다.

+2

= "다형성"을 살펴보십시오 – Mik378

+0

어려운 방법은 리플렉션을 통해 방법이 있는지 확인하는 것입니다. –

답변

4

C1 및 C2 인스턴스의 별도 ArrayList를 유지해야하거나 해당 하위 유형의 메소드를 사용하려면 해당 유형으로 캐스트해야합니다. 또한, 그렇지 않으면 당신은 ClassCastException를 얻을 것이다, 당신은 캐스팅을하기 전에 요소가 특정 서브 타입의 인스턴스가 실제로 있는지 확인하기 위해 instanceof를 키워드를 사용할 수 있습니다

A.get(x).method_of_C0(); 
((C1)A.get(0)).method_of_C1(); 
((C2)A.get(1)).method_of_C2(); 

:처럼 뭔가.

하지만이 코드는 꽤 나쁜 코드 냄새가 있으므로 필요한 경우 각 하위 유형을 추적하는 것이 좋습니다.

0

여기서 문제는 ArrayList의 새 인스턴스를 인스턴스화 할 때 객체 유형을 선언하지 않는다는 것입니다.

ArrayList<C0> A = new ArrayList<C0>(); 
A.add(new C1()); 
A.add(new C2()); 

이제 다음 코드 줄 작동합니다 :
는 여기에 귀하의 문제를 해결하는 가장 쉬운 방법입니다. C1과 C2가 C0의 하위 클래스 인 한.

A.get(0).method_C1(); 
A.get(1).method_C2();