Pregunta

Mi pregunta se refiere a las mejores prácticas para acceder al padre de un objeto secundario.Entonces, digamos que una clase crea una instancia de otra clase, esa instancia de clase ahora está referenciada con un objeto.Desde ese objeto secundario, ¿cuál es la mejor manera de hacer referencia al objeto principal?Actualmente conozco un par de formas que uso con frecuencia, pero no estoy seguro de si A) hay una mejor manera de hacerlo o B) cuál de ellas es la mejor práctica.

El primer método es usar getDefinitionByName, que no crearía una instancia de esa clase, pero permitiría el acceso a cualquier cosa dentro de ella que haya sido declarada públicamente.

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

Y luego haga referencia a esa variable según su jerarquía de padre a hijo.
Por ejemplo, si el niño intenta hacer referencia a una clase que está dos niveles por encima de ella misma:

_class(parent.parent).function();

Esto parece funcionar bien, pero es necesario saber el nivel en el que se encuentra el niño en comparación con el nivel del padre al que intenta acceder.

También puedo obtener la siguiente declaración para rastrear [nombre de clase del objeto] en la salida de Flash.

trace(Class);

No estoy al 100% en la implementación de esa línea, no la he seguido como una forma de hacer referencia a un objeto fuera del objeto actual en el que estoy.

Otro método que he visto utilizado es simplemente pasar una referencia a this al objeto de clase que estás creando y simplemente capturarlo con un argumento de constructor.

var class:Class = new Class(this);  

y luego en el archivo de clase

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

Sin embargo, esa referencia también requiere que vuelvas a utilizar la jerarquía de hijo a padre.

También podría importar esa clase y luego usar la ruta de archivo directa para hacer referencia a un método dentro de esa clase, independientemente de si es padre o no.

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

Por supuesto, la relación padre-hijo es irrelevante porque accedo al método o propiedad directamente a través de la clase importada.

Siento que me estoy perdiendo algo realmente obvio aquí.Básicamente, estoy buscando confirmación de si estas son las formas correctas de hacer referencia a los padres y, de ser así, ¿cuál es la más ideal o estoy pasando por alto algo más?

¿Fue útil?

Solución

En general, es bueno tener la clase como su propia instancia y reducir el acoplamiento estrecho con otra cosa (como en este caso, su padre).Si haces algo como parent.doSomething() no es posible usar esa clase en un contenedor que no tenga el método doSometing().Creo que definitivamente es mejor aprobar cualquier cosa que la clase pueda necesitar y luego, dentro de la clase, ya no tener que hacer nada parent.parent, etc.

Con esto, si en el futuro desea cambiar la estructura, es muy fácil simplemente pasar una nueva referencia;la implementación de la clase secundaria no tiene por qué cambiar en absoluto.

La tercera alternativa que tienes aquí también es muy diferente, es acceder a un método estático a nivel de clase (no tienes que escribir toda la ruta de clases al acceder a ese método), no a un método de instancia como en los dos primeros.

Otros consejos

En general, si necesita que un niño se comunique con sus padres, debería considerar la posibilidad de que lo haga mediante la transmisión de eventos.Esto desacopla al niño del padre y hace posible que otras clases trabajen con el niño.

No recomendaría pasar una referencia a la clase principal a la secundaria.

Aquí hay un ejemplo simple (lo he probado/compilado, por lo que puede haber algunos errores tipográficos).

//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");
        }

    }
}

En la mayoría de los casos, enviaría eventos personalizados y pasaría datos con ellos.

Básicamente:

El padre tiene referencia al niño y se comunica mediante llamadas a métodos.El niño no tiene referencia al padre y se comunica (con cualquier persona) a través de eventos de envío.

Espero que ayude...

cámaras de micrófono

malla@adobe.com

Siempre he usado su segundo método, pasando un puntero al objeto principal al hijo y almacenando ese puntero en una variable miembro en la clase secundaria.Para mí, ese parece ser el método más simple para que el niño se comunique con sus padres.

Me gusta pasar el padre como una interfaz (para que la clase pueda estar contenida en cualquier padre que implemente esa interfaz) o implementar la referencia como un evento/puntero de función/delegado al que el padre puede conectarse.

Me gusta configurar una clase global para manejar referencias a clases a las que debe acceder cualquier otra clase, no necesariamente la secundaria.

La clase global simplemente consta de captadores y definidores estáticos como este:

private static const class:Class;

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

Lo bueno de esto es que no es necesario importar la clase que regresa de la clase global, solo la clase global misma.

La clase a la que se debe hacer referencia se agrega a la lista global.La otra cosa interesante es que puedes enviar eventos fácilmente desde esta ubicación centralizada.

La mayoría de las veces, si las clases secundarias o cualquier otra clase necesitan hacer referencia a una clase, lo hago a través de una interfaz.

Si estos objetos están en DisplayList, entonces tiene algunas opciones más.Si tengo una ParentClass y una ChildClass, en la clase secundaria, parece que puedes acceder a la clase principal si envías la solicitud como ParentClass.p.ej.

ParentClass(parent).parentFunction();

Estoy seguro de que funciona si ParentClass es la clase de documento.Como la Clase de documento es siempre el primer elemento en la lista de visualización, esto funciona:

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

En mi caso, ambos eran miembros del mismo paquete, por lo que ni siquiera tuve que importar nada.No lo he probado en todas las circunstancias, pero funcionó cuando lo necesitaba.

Por supuesto, 'parent' y 'getChild...' solo funcionan si estos objetos están en DisplayList, pero eso ha sido suficiente para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top