문제

내 질문은 하위 개체의 상위 개체에 액세스하는 모범 사례에 관한 것입니다.따라서 클래스가 다른 클래스를 인스턴스화한다고 가정하면 해당 클래스 인스턴스는 이제 객체로 참조됩니다.해당 하위 개체에서 상위 개체를 다시 참조하는 가장 좋은 방법은 무엇입니까?현재 저는 제가 자주 사용하는 몇 가지 방법을 알고 있지만 A) 더 좋은 방법이 있는지 B) 그 중 어느 것이 더 나은 방법인지 잘 모르겠습니다.

첫 번째 방법은 해당 클래스를 인스턴스화하지 않지만 공개적으로 선언된 내부 항목에 대한 액세스를 허용하는 getDefinitionByName을 사용하는 것입니다.

_class:Class = getDefinitionByName("com.site.Class") as Class;

그런 다음 상위 계층과 하위 계층 구조를 기반으로 해당 변수를 참조합니다.
예를 들어, 자식이 자신보다 두 수준 높은 클래스를 참조하려고 하는 경우:

_class(parent.parent).function();

이것은 잘 작동하는 것처럼 보이지만 접근하려는 부모의 수준과 자녀의 수준을 비교하여 알아야 합니다.

또한 [object ClassName]을 Flash의 출력으로 추적하기 위해 다음 명령문을 얻을 수도 있습니다.

trace(Class);

나는 그 줄의 구현에 대해 100%는 아니며, 내가 속한 현재 개체 외부의 개체를 참조하는 방법으로 그것을 설득하지 않았습니다.

내가 본 또 다른 방법은 생성 중인 클래스 객체에 이에 대한 참조를 전달하고 생성자 인수를 사용하여 이를 잡는 것입니다.

var class:Class = new Class(this);  

그런 다음 클래스 파일에서

public function Class(objectRef:Object) {
    _parentRef = objectRef;
} 

또한 해당 참조에서는 하위 계층에서 상위 계층으로의 백업을 수행해야 합니다.

또한 해당 클래스를 가져온 다음 직접 파일 경로를 사용하여 상위 클래스인지 여부에 관계없이 해당 클래스 내부의 메서드를 참조할 수도 있습니다.

import com.site.Class;
com.site.Class.method();

물론 가져온 클래스를 통해 메서드나 속성에 직접 액세스하기 때문에 부모-자식 관계는 관련이 없습니다.

나는 여기서 정말 분명한 것을 놓치고 있는 것 같은 느낌이 듭니다.기본적으로 이것이 부모를 참조하는 올바른 방법인지, 그렇다면 가장 이상적인 방법인지 확인을 찾고 있습니다. 아니면 다른 것을 간과하고 있습니까?

도움이 되었습니까?

해결책

일반적으로 클래스를 자체 인스턴스로 갖고 다른 항목(이 경우 부모)과의 긴밀한 결합을 줄이는 것이 좋습니다.parent.doSomething()과 같은 작업을 수행하는 경우 doSometing() 메서드가 없는 컨테이너에서는 해당 클래스를 사용할 수 없습니다.내 생각에는 클래스에 필요할 수 있는 모든 것을 전달한 다음 클래스 내부에서 더 이상 parent.parent 등을 수행할 필요가 없는 것이 더 낫다고 생각합니다.

이를 통해 나중에 구조를 변경하려는 경우 새 참조를 전달하기만 하면 매우 쉽습니다.하위 클래스의 구현은 전혀 변경할 필요가 없습니다.

여기에 있는 세 번째 대안도 매우 다릅니다. 이는 처음 두 가지와 같은 인스턴스 메서드가 아니라 클래스 수준 정적 메서드(해당 메서드에 액세스할 때 전체 클래스 경로를 입력할 필요가 없음)에 액세스하는 것입니다.

다른 팁

일반적으로 아이가 부모와 소통해야 한다면 이벤트를 방송해 보도록 하는 것이 좋습니다.이렇게 하면 부모 대신 자식이 분리되고 다른 클래스가 자식과 함께 작업할 수 있게 됩니다.

나는 부모 클래스에 대한 참조를 자식에게 전달하는 것을 권장하지 않습니다.

다음은 간단한 예입니다(테스트/컴파일했기 때문에 일부 오타가 있을 수 있습니다).

//Child.as
package
{
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class Child extends EventDispatcher
    {
        public function doSomething():void
        {
            var e:Event = new Event(Event.COMPLETE);
            dispatchEvent(e);
        }

        public function foo():void
        {
            trace("foo");
        }
    }
}


//Parent.as
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class Parent extends Sprite
    {
        private var child:Child;
        public function Parent():void
        {
            c = new Child();
            c.addEventListener(Event.COMPLETE, onComplete);
            c.foo();//traces foo

            c.doSomething()
        }

        public function onComplete(e:Event):void
        {
            trace("Child broadcast Event.COMPLETE");
        }

    }
}

대부분의 경우 사용자 정의 이벤트를 전달하고 데이터를 전달합니다.

원래:

부모는 자식을 참조하고 메서드 호출을 통해 통신합니다.하위는 상위를 참조하지 않으며 이벤트 전달을 통해 (누구에게나) 통신합니다.

도움이 되길 바라요...

마이크 챔버

mesh@adobe.com

저는 항상 두 번째 방법을 사용했습니다. 상위 개체에 대한 포인터를 하위 개체에 전달하고 해당 포인터를 하위 클래스의 멤버 변수에 저장하는 것입니다.나에게는 이것이 아이가 부모에게 다시 의사소통하는 가장 간단한 방법인 것 같습니다.

나는 부모를 인터페이스로 전달하거나(클래스가 해당 인터페이스를 구현하는 모든 부모에 포함될 수 있음) 부모가 연결할 수 있는 이벤트/함수 포인터/대리자로 참조를 구현하는 것을 좋아합니다.

나는 반드시 자식 클래스가 아닌 다른 클래스에서 액세스해야 하는 클래스에 대한 참조를 처리하기 위해 전역 클래스를 설정하는 것을 좋아합니다.

전역 클래스는 다음과 같이 정적 getter와 setter로 구성됩니다.

private static const class:Class;

public static function setClass(_class:Class){
class = _class;
}
public static function getClass(void):Class{
return class;
}

이것의 좋은 점은 전역 클래스에서 반환하는 클래스를 가져올 필요가 없고 전역 클래스 자체만 가져올 수 있다는 것입니다.

참조해야 하는 클래스는 전역 목록에 자체적으로 추가됩니다.또 다른 멋진 점은 이 중앙 집중식 위치에서 이벤트를 쉽게 전달할 수 있다는 것입니다.

클래스를 하위 클래스나 다른 클래스에서 참조해야 하는 경우 대부분의 경우 인터페이스를 통해 수행합니다.

이러한 객체가 DisplayList에 있으면 더 많은 옵션이 있습니다.ParentClass와 ChildClass가 있는 경우 하위 클래스에 ParentClass로 요청을 캐스트하면 부모에 액세스할 수 있는 것 같습니다.예를 들어

ParentClass(parent).parentFunction();

ParentClass가 문서 클래스이면 작동한다는 것을 확실히 알고 있습니다.문서 클래스는 항상 표시 목록의 첫 번째 항목이므로 다음과 같이 작동합니다.

ParentClass(stage.getChildAt(0)).parentFunction();

제 경우에는 둘 다 같은 패키지의 멤버였기 때문에 아무것도 가져올 필요조차 없었습니다.모든 상황에서 테스트하지는 않았지만 필요할 때 작동했습니다.

물론 'parent'와 'getChild...'는 이러한 객체가 DisplayList에 있는 경우에만 작동하지만 제겐 그것만으로도 충분했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top