2011-08-21 4 views
2

를 슈퍼 클래스 캐스트없이 경고가 발생 나는 다음과 같은 상속 트리가 :상속 된 메서드를 호출하면

NSObject <- GameObject <- RenderableObject <- SimpleBullet 

GameObject이 객체의 경계를 돌려줍니다 bounds라는 메소드를 가지고 있습니다. 내 코드에서 해당 bounds을 호출하는 SimpleBullet이 있고 여러 위치에 bounds이라는 경고가 표시됩니다. 이상한. SimpleBulletGameObject으로 캐스팅하고 bounds 메서드를 호출하면 모든 것이 예상대로 작동합니다. 무슨 일이야? 나는이 행동을 이해할 수 없다. 예 : 내가 말했듯이

SimpleBullet* bullet = bulletInstance; 
[bullet bounds]; // we get the warning. 
[(GameObject*)bullet bounds]; // works as expected. 

bounds 방법은 GameObject에 정의되어 있지만, 왜의 Obj-C는 SimpleBullet 날 경고없이 메소드를 호출 할 수 있도록 GameObject 및 아님을 인식하지 못합니다?

+0

컴파일러는'bullet'이'id' 변수가 아닌'SimpleBullet' 객체라는 것을 알고 있습니까? 'id' 변수에 대해 메소드를 호출하면 컴파일러가 혼동을 일으킬 수 있습니다. – zneak

+0

코드를 조금 더 보여줄 수 있습니까? ** 정확한 ** 오류 메시지 란 무엇이며 정확히 어디에서 발생합니까? 더 많은 코드를 표시하십시오. ObjC에서 메시지 전송은 클래스 계층 구조에 바인딩되지 않으므로 해당 선택기에도 응답하는 다른 클래스가있는 경우 경고를받는 이유 일 수 있습니다. –

+2

온 전성 검사로서, 나는 당신의 설명을 정확하게 따르는 간단한 시험을 만들었고 정상적으로 작동합니다. 최소한의 테스트 케이스를 제공 할 수 있습니까? (실제 코드를 실행하고 의사 코드가 아닌 오류를 보았을 때) 실제로 문제가 발생합니까? – Chuck

답변

3

몇 가지 조사를 한 후에 어떤 일이 일어 났는지 알 수있었습니다. 컴파일러는 의미있는 오류를보고하지 않았기 때문에 나에게 속임수를 사용하고있었습니다. 문제는 SimpleBullet.h를 가져 오거나 포함하지 않는다는 것입니다. 전방 선언이 선언되었지만 실제 구현은 선언되지 않았습니다.

이것은 기본적으로 컴파일러가이를 ID 객체로 처리하고 호출 서명에 적합한 모든 등록 된 클래스 중에서 메소드를 찾으려고합니다. 그냥 추측, 이것에 대해 잘 모르겠다. :)

모든 도움에 감사드립니다.

+2

다음은 잘못된 것입니다. 클래스를 앞으로 선언하면 컴파일러는 존재하는 것 외에는 아무것도 알지 못합니다. 특히, 컴파일러는 수퍼 클래스가 무엇인지 구현하는 방법을 알지 못합니다. 전달 선언은 주로 순환 수입을 깰 수 있도록하기위한 것입니다. 실제로 파일을 가져 오기위한 완벽한 대체품은 아닙니다. – Chuck

+0

물론, 전달 작업과 사용법을 알고 있습니다. 정말 궁금해하는 이유는 컴파일러가 "클래스를 찾을 수 없거나 정의 됨", "알 수없는 심볼", "클래스 구현을 찾을 수 없습니다"등과 같은 오류를보고하지 않았기 때문입니다. 제공. 그래서 내가 무엇을하고 있었는지 추측하려고했습니다. – Notbad

1

UIView-bounds 방법을 갖는다. 메서드의 반환 유형이 동일한 지 확인하십시오.

+0

예. UIView도 경계 메서드가 있습니다. 그러나 SimpleBullet은 UIView와 아무 관련이 없습니다. 컴파일러가 왜 그것에 대해 불평하는지 알지 못한다. 내 말은, 그들은 상속 나무에서 어떤 식 으로든 관련이 없다는 것입니다. 이상한 것은 GameObject * (경계 메서드가있는 클래스)로 캐스팅하면 경고가 사라진다는 것입니다. 컴파일러가 여전히 UIView에서 boudns 메서드를 사용하는 것에 대해 불평하지 않는 이유는 무엇입니까? – Notbad

+0

모든 것이 정확하게 입력되어야합니다. – Chuck

관련 문제