2012-12-04 4 views
0

개체 VMemRead의 인스턴스가 있습니다 (r이라고 부름). VMemRead의 생성자 보이는 필드 destsourceJAVA : 다른 개체의 하위 클래스에 액세스하는 방법?

VMemRead(SourcePos sourcePos, VVarRef dest, VMemRef source) 

있다. 내가 dest에 액세스하고 싶을 때, 나는 단지 할 수 있습니다. r.dest. 그러나, 나는 "더 깊게"원천으로 가고 싶다.

VMRef에는 두 개의 중첩 클래스 VMemRef.GlobalVMemRef.Stack이 있습니다. VMemRef.Global에는 생성자가 있습니다

VMemRef.Global(SourcePos sourcePos, VAddr<VDataSegment> base, int byteOffset) 

int byteOffset에 액세스하고 싶습니다. 실제로, r.source.Global.byteOffset과 같은 것을하고 싶지만 Java는 이것을 허용하지 않습니다.

그 값에 액세스 할 수있는 방법이 있습니까?

문서 : VMemRead : http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRead.html#source

VMemRef : http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRef.html

VMemRef.Global : http://cs.ucla.edu/classes/spring11/cs132/kannan/vapor-parser/vapor-parser-javadoc/cs132/vapor/ast/VMemRef.Global.html

대단히 감사합니다!

+4

형식으로 질문을하고, 좋은 포맷, 단지 어떻게 그렇게 말 –

+0

주위 임의 코드 블록을 때리는하지? 코드를 코드로 적절하게 표시했다고 생각했습니다. – pauliwago

+0

또한 중첩 된 의미로 혼란 스럽습니까? 내부 클래스 또는 문자 그대로'extends VMemRef'라고 말하면 확장 할 수 있습니까? 왜냐하면'r.source.Global.byteOffset'을 말하는 것이 틀림없이 틀린 것입니다. 당신이 정확히 당신이 그것을 가지고 있는지 모릅니다. – Andy

답변

1

이러한 중첩 클래스는 정적입니다. 각각에 대해 필드 값에 액세스하려면 인스턴스에 대한 참조가 필요합니다. VMemRef의 인스턴스에는 VMemRef.Global 또는 VMemRef.Stack 유형의 멤버 필드가 (문서화 된) 없습니다. 해당 클래스의 데이터는 r 이외의 다른 곳을 찾아야합니다. 즉

, 당신은 r에서 VMemRef의 인스턴스가 간단하기 때문에, 그것은 주위 VMemRef.Global 또는 VMemRef.Stack의 인스턴스가있는 것은 아닙니다. 따라서 "그 가치"가 반드시 존재하지는 않기 때문에 "그 가치"에 접근 할 수있는 방법이 없습니다!

편집 API를 다시 읽은 후, 나는 VMemRef는 추상 클래스이고 r.sourceVMemRef.Global 또는 VMemRef.Static 중 하나의 인스턴스 인 것을 알 수있다. 그 이야기가 바뀝니다. 당신은 같은 것을 수행 할 수 있습니다

if (r.source instanceof VMemRef.Global) { 
    VMemRef.Global source = (VMemRef.Global) r.source; 
    // access fields specific to VMemRef.Global 
} else if (r.source instanceof VMemRef.Stack) { 
    VMemRef.Stack source = (VMemRef.Stack) r.source; 
    // access fields specific to VMemRef.Stack 
} 
+0

도움 주셔서 감사합니다! 그것은 실제로 의미가 있지만 실제로'r.source '를 출력 할 때 인쇄되고 있습니다.toString()'그럼? – pauliwago

+0

@pauliwago - 아. VMemRef의 인스턴스가없는 것처럼 보입니다. 항상'VMemRef.Global' 또는'VMemRef.Stack'의 인스턴스입니다. 나는 그것을 어떻게 다루는 지 보여주기 위해 나의 대답을 업데이트했다. –

+0

정말 고마워요! 그게 :) – pauliwago

관련 문제