2011-10-05 4 views
1

모두AS3 : SWF는 외부 .as 클래스 파일에서 어떻게 컴파일됩니까?

내가 만들고있는 Flash 앱에는 다양한 "하위"SWF가로드되는 "기본"SWF가 있습니다.

주 SWF 및 하위 SWF에 대한 모든 AS3 코드는 외부 .as 클래스 파일에 포함됩니다.

즉, 각 영화에는 자체 문서 클래스 .as 파일이 있습니다.

또한 모든 공통 요소 (예 : e..g, UI 단추 및 컨트롤)에 대한 여러 .as 클래스 파일이 있습니다.

예를 들어 내 기본 SWF와 모든 하위 SWF에서 모두 "MyCommandButton"클래스를 사용합니다. 이 클래스의 코드는 모든 SWF가 참조 (가져 오기)하는 MyCommandButton.as에 있습니다.

다음은 내가 이해하지 못하는 이유입니다.

( 는 이제 MyCommandButton.as의 코드가 빨간색 버튼을 그립니다한다고 가정 해 봅시다.를)

먼저, 내가 하위 SWF의 모든를 컴파일합니다. 이 그리는 버튼을 블루을되도록

은 다음, 내가 대신 빨간색의, MyCommandButton.as을 변경합니다.

다음 주 SWF를 컴파일합니다. 나는 응용 프로그램 (main.swf), 내가 을 기대를 실행하면

기본 SWF의 모든 버튼이되고 블루 (즉, main.swf가 컴파일 될 때 지정된 MyCommandButton.as 무엇 때문에) 및 자식 국부 펀드의 모든 버튼은 내가 만든 변화를 의미 대신 빨간색 (즉 그들이 컴파일 때 지정된 MyCommandButton.as 무엇 때문입니다.)

, 버튼의 모든 파란색이 될 것입니다 to MyCommandButton.as는 자식 SWF를 모두 다시 컴파일하지 않았지만 모든 하위 SWF에 영향을 미쳤습니다.

왜 이런가요? 이것이 일어나는 이유에 대한 간단한 설명이 있습니까?

미리 감사드립니다.

답변

4

Flash가로드 된 바이트 코드를 처리하는 방식 때문입니다. 특히 ApplicationDomain 설명서를 살펴보십시오.

시스템 도메인을 제외한 모든 응용 프로그램 도메인에는 연결된 부모 도메인이 있습니다. 기본 응용 프로그램의 응용 프로그램 도메인의 상위 도메인은 시스템 도메인입니다. 로드 된 클래스는 부모가 아직 정의하지 않은 경우에만 정의됩니다. 로드 된 클래스 정의를 새 정의로 겹쳐 쓸 수 없습니다.

"로드 된 클래스는 부모가 아직 정의하지 않은 경우에만 정의됩니다"섹션에 유의하십시오.하위 SWF의 MyCommandButton 클래스는 기본 SWF (상위 ApplicationDomain)에 이미 있으므로 사용되지 않습니다.

해킹을 방지하기 위해 특히 중요합니다. SWF를 누군가의 동적 응용 프로그램에 삽입하고 모든 클래스를 다시 작성할 수있는 가능성을 생각해보십시오.

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e07.html

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html

+0

이있는 * 멋진 * 대답 - 감사 meddlingwithfire! 흥미 롭습니다. 해킹 관점에서로드 된 (하위) SWF가 부모 클래스를 다시 쓸 수 없어야하는 이유를 알았습니다. 그러나 실수로 각 SWF가 실제로 자체 포함되어 있다고 가정했습니다. 그래서 부모는 "classA"의 버전을 가질 수 있고,로드 된 SWF는 "classA"의 자체 (다른) 버전을 가질 수 있습니다. 그것이 작동하는 방식으로 작동한다는 사실은 꽤 중요한 이점입니다. 자식 SWF가 동일한 클래스 정의를 참조하는지 여부를 결정할 때 전체 네임 스페이스를 사용한다고 가정합니다. – mattstuehler

+0

각 SWF는 자체적으로 실행됩니다. 각 SWF를 자체적으로 실행하여 볼 수 있습니다. SWF를 다른 SWF로로드하기 시작할 때 추가되는 보안 규칙이 몇 가지 있습니다. 네임 스페이스에서 수정 - 클래스 네임 스페이스는 클래스를 확인할 때 고려됩니다. 따라서 부모는 기본 네임 스페이스에서 "MyCommandButton"을 정의 할 수 있으며 자식은 "child.MyCommandButton"을 정의 할 수 있으므로 충돌이 발생하지 않습니다. 또한 -이 대답을 수락하면 대답으로 표시하십시오. :) – meddlingwithfire

관련 문제