2013-05-16 3 views
1

배열 목록에 사용되는 다른 클래스를 확장하는 클래스 외부의 변수에 액세스하려면 어떻게합니까? 변수가 확장 클래스에 존재하지 않는다는 오류가 표시됩니다. 해서, 내 개체 클래스는 40 개 이상의 변수가,다른 클래스를 확장하는 클래스 외부의 액세스 변수

public abstract class Object { 
    public int x, y; 
} 

public class House extends Object { 
    public int members = 10; 
} 

// Somewhere else 
ArrayList<Object> list = new ArrayList<Object>(); 
list.add(new House()); 
for (Object o : list) { 
    o.members; 
} 

문제는 RTS에 내가 쓰고 있다는 것입니다 : 내 개체 클래스를 선언하지 않고 변수 멤버에 액세스하려면,보세요 하위 클래스에서만 선언하고 외부에서 액세스 할 수는 없습니다. 당신이 이해할 수 있기를 바랍니다. 어떻게해야합니까?

+3

클래스의 이름을 '객체'로 지정하지 마십시오. 'Object'를 확장 한 다른 클래스는 무엇입니까? 이 수업에도 '회원'이 있습니까? –

+0

@LutzHorn 내 프로그램에서 실제로 Object라는 것은 아닙니다. 예, Object를 확장하는 다른 클래스가 있으며, 또한 자신의 메서드와 변수를 가질 수 있기를 바랍니다. – lawls

+0

http : // stackoverflow 도움이 될 수 있으면 내 대답을 볼 수 있습니다.com/questions/15999934/get-variable-in-other-classes/16000005 # 16000005 이 하나도 http://stackoverflow.com/questions/16153968/proper-way-of-accessing-variable-java- android/16154388 # 16154388 –

답변

8

:

for (Object o : list) { 
    if (o instanceof House) { 
     h = (House) o; 
     h.members; 
    } 
} 

그러나이 종종 잘못된 설계로 간주됩니다; Object (은 실제로이 다른 이름으로 지적해야 함)에 적절한 방법을 정의하고 House으로 재정의해야합니다. 그런 다음 Object에서이 메서드를 호출 할 수 있습니다.이 개체는 해당 개체의 종류를 알지 못하며 House 인 경우 올바른 메서드가 호출됩니다. (적절하게이 작업을 수행하는 방법을 학습하고 그것을 할 때, 약간의 연습이 필요 -. 및 을 무시 polymorphy 구글) 당신은 집에 O를 캐스팅해야

+0

좋은 하나. +1. –

+0

@ Er.NikhilAgrawal : 감사합니다! –

+0

고맙습니다! 그래서 오히려 당신이 제안한 방식대로 40 개의 변수를 모두 Object에 유지해야합니다. – lawls

0

클래스의 이름을 Java의 모든 클래스에 대한 부모 클래스 인 '객체'로 사용하고 계신 것을 이해 하셨 으면합니다. 여러분의 환경에서 java가 java.lang.Object에서 제공하는 두 개의 Object 클래스와 여러분이 만든 하나의 Object 클래스가있을 것이다. 따라서 클래스 객체에 액세스하려고 시도 할 때 속성을 얻으려고하면 클래스 객체가 아니라 java.lang.Object의 인스턴스가되므로 문제가 발생합니다.

당신은 instanceof 및 캐스트 사용할 수 있습니다
+1

이것은 매우 유효한 지적이지만 질문에 답하지 않으므로 대신 주석으로 게시해야합니다. –

0

. 예 :

0

((House) o).members는 클래스 Object를 (주석 참조)의 이름없는이

((House)o).members; 
3

처음처럼의 ArrayList의 멤버를 캐스팅. Object에 member, House 필드가 없으므로 코드에서 Objectmember에 액세스 할 수 없습니다. 그러나 ObjectHouse 일 필요는 없으므로, member이라는 보장은 없습니다. 이 경우 개봉 Object항상House 있는지 경우

, 캐스팅 :

((House) anObject).member; 

컴파일러는 가정이 방법을 사용하면 실제 클래스에 대한 그보다 더 알고 Object를 처리하고 마치 House 인 것처럼 처리합니다. instanceof을 사용하여 캐스트가 유효한지 확인할 수 있습니다.

관련 문제