2013-08-16 5 views
1

저는 Java 애플릿으로 게임을 프로그래밍하고 있는데, 비슷한 변수를 가진 두 개의 다른 클래스 (PavementWay)가 있습니다.다른 유형의 객체 배열

두 클래스의 개체를 포함 할 Array를 만들고 싶습니다. 예를 들어 xy을이 모든 개체 중에서 변경해야하므로 Array을 만들고 싶습니다. 가능한가요?

나는 ArrayList<Object> obj = new ArrayList<Object>();을 시도했지만, 내가 obj.add(0, theWay); 인 경우 변수를 읽을 수있는 방법을 찾을 수 없습니다.

또한 System.out.print(obj.get(0));을 시도했으며 [email protected]을 받았습니다.

+0

배열이 아닌 'ArrayList'를 사용하고 있습니다. '포장 도로'와 '길'은 어떻게 생겼습니까? 질문에 코드를 추가하십시오. –

답변

6

간단히 말해 Way 객체 또는 포장 인스턴스인지 여부를 알지 못하는 Way 인스턴스 또는 Pavement 인스턴스에서 메소드 (예 : setX())를 호출하려고합니다.

이것은 정확하게 다형성이 해결하는 문제입니다. Locatable 인터페이스를 정의하고 두 클래스가이 인터페이스를 구현하도록하십시오. 그런 다음 List<Locatable>을 만들고, 당신은 그 안에 방법 및 도로 포장을 추가 할 수 있습니다 :

public interface Locatable { 
    public void setX(int x); 
    public void setY(int y); 

    public int getX(); 
    public int getY(); 
} 

public class Way implements Locatable { 
    ... 
} 

public class Pavement implements Locatable { 
    ... 
} 

List<Locatable> locatables = new ArrayList<Locatable>(); 
list.add(new Way()); 
list.add(new Pavement()); 
for (Locatable locatable: locatables) { 
    locatable.setX(22); 
    locatable.setY(43); 
} 

for (Locatable locatable: locatables) { 
    System.out.println("the locatable is an instance of " + locatable.getClass()); 
    System.out.println("its location is " + locatable.getX() + ", " + locatable.getY()); 

} 
1

ArrayList<Object>을 사용할 수 있으며 개체 유형을 확인할 수 있습니다. 예를 들어

:

ArrayList<Object> L = new ArrayList<Object>(); 
//..add objects 
for (Object o : L){ 
    if(o.getClass() == Class1.class){ 
     Class1 obj1 = (Class1) o; 
     //... 
    }else if(o.getClass() == Class2.class){ 
     Class2 obj2 = (Class2) o; 
     //... 
    }else{ 
     //... 
    } 
} 

또한 유형을 확인 instanceof를 사용할 수 있습니다.

+0

나는 그것을 의미하지 않았다. x와 y 변수에 접근하기 위해 예를 들어 10 개의 도로 객체와 10 개의 포장 객체를 하나의 배열에 넣고 싶습니다. 너 도와 줄래? –

0

을 당신은 클래스가 다르지만 비슷 언급? 클래스에서 비슷한 클래스를 사용하여 클래스에서 동일한 메서드를 호출하려는 경우 추상 클래스를 사용하여 클래스를 일반화하는 것이 좋습니다. 이는 "인스턴스"및 카스트 솔루션보다 훨씬 좋습니다. 인터페이스를 사용할 수도 있지만 추상 클래스를 사용하면 같은 방식으로 작동하는 경우 실제로 changeX() 및 changeY()를 구현할 수 있습니다. 당신이 상관없이 Way 또는 Pavement 객체가 있는지의 대상 중 하나에 changeX (INT의 X) 또는 changeY (INT의 y)를 호출 할 경우 예를 들어, 당신은 아마 이런 식으로 뭔가를하고 싶지 :

public abstract class Changeable 
{ 
    public void changeX(int x) { 
     this.x = x; 
    } 
    public void changeY(int y) { 
     this.y = y; 
    } 

    protected int x; 
    protected int y; 
} 

public Class Pavement extends Changeable{ ... } 

public Class Way extends Changeable{ ... } 

어느 시점에서 당신은 인터페이스의 배열을 생성하고 내부에 객체를 삽입 할 수 있습니다 :

List<Changeable> paths = new ArrayList<Changeable>(); 
paths.add(new Way()); 
paths.add(new Pavement()); 
Changeable path = paths.get(0); 
path.changeX(5); 
path.changeY(7); 
관련 문제