0
//Base.as
public class Base
{
    private var _foo:String;

    [Bindable]
    public function set foo(value:String):void
    {
        _foo = value;
    }

    public function get foo():String
    {
        return _foo;
    }

    /*
    Many many setter/getter, methods, events
    */
}

//Control.as
public class MyControl extends Group
{
    public function MyControl()
    {
    }
}

//Window.as
public class MyWindow extends spark.components.Window
{
    public function MyWindow()
    {
    }
}

//Module
public class MyModule extends spark.modules.Module
{
    public function MyModule()
    {
    }
}

我想在其他类上公开(友好的)基本属性、方法和事件。像这样的东西:

var window:MyWindow = new MyWindow();
window.foo = 'Hello World!';
var module:MyModule = new MyModule();
module.foo = 'bar';

<namespace:MyControl foo="Hello World!"/>

我不想定义每个类中的所有属性,因为它们很多且对所有类都相同。

理想情况下会定义如下内容:

public class MyControl extends Group, Base
{
    public function MyControl()
    {
    }
}

(我知道这是不可能的。)

谢谢!

更新: 再次感谢!

也许这更能说明我的需求......在业务层上,我有一个名为 processID 的变量(以及 businessID、operationID、localityID 等),它从 Menu 传递给 Window,然后 Window 将其传递给 Module。在 Module Container 上,我有一个 CustomComponent 使用此变量作为参数查询数据库。这适用于模块上的所有(几乎)组件。这些变量被定义为级别业务层,然后我定义了一个类来存储和管理这些变量(以及使用业务逻辑与这些变量一起操作的一些相关方法),因此我可以为每个环境创建一个独立的类(或库)以重用我的常用组件。这个想法是......插入一个新的 CustomComponent 并通过 mxml 设置这些变量,如下所示:

<custom:MyCustomComponent id="zzz" processID="{processID}" businessID="{businessID}"/>

模块具有设置(不)任何变量的业务逻辑。

否则,我将不得不为 CustomComponent(和模块)实现不同的逻辑以读取父级的变量,并仅在 MyWindow 中定义这些变量(使用复合模式)。

4

2 回答 2

0

您可以从以下链接获得答案 -

http://flexinonroids.wordpress.com/2009/05/27/flex-3-dynamically-loading-components-at-runtime/ http://thecomcor.blogspot.in/2007/11/adobe-flex-dynamically-加载类.html

或者您可以按照以下方法 -

1) 创建一个接口作为基础
2) 使用接口扩展您的类
3) 在运行时使用 SWFLoader.loaderContext.applicationDomain.getDefinition 方法加载类

谢谢,

瓦伦

于 2013-02-14T08:54:22.017 回答
0

您可以将需要友好访问的类与您的Base类放在同一个包中,并定义不带任何访问修饰符的私有字段(相当于internal修饰符)。

否则,您可以像这样定义命名空间:

namespace my_internal;

然后像这样定义类成员:

my_internal var _foo:String;

之后,这些成员将对所有代码隐藏,除了包含

use namespace my_internal;

您可以在此处阅读更多信息:http: //help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9e.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f91

但是,使用“朋友访问”可能是设计不佳的证据,所以如果我是你,我会在定义名称空间之前三思而后行。

更新:

伪超类 1:

package proxy
{
    public class Simple1
    {
        public var x:int;
        public var y:int;
    }
}

伪超类 2:

package proxy
{
    import mx.controls.Alert;
    public class Simple2
    {
        public var name:String = 'noname';
        public function doAlert():void{
            Alert.show(name);
        }

        //not normal method to replace 'this' with proxy
        Simple2.prototype.doCrossClass =  function doCrossClass():void{
            Alert.show(''+(Number(this['x'])+Number(this['y'])));
        }
    }
}

测试结果的代码(看起来和你期望的一样?):

var mega:Mega = new Mega();
mega.x = 100;
mega.y = 200;
mega.name = 'Multiple inheritance';
mega.doAlert();
mega.doCrossClass(); //300

现在是具有多重继承的伪子类:

package proxy
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    public dynamic class Mega extends Proxy
    {
        public function Mega()
        {
            super();
        }

        public var superArray:Array = [new Simple1(), new Simple2()];

        flash_proxy override function getProperty(name:*):*{
            for each(var superClass:Object in superArray){
                if( name in superClass){
                    return superClass[name];
                }
            }
            throw new Error('no such property');
        }

        flash_proxy override function setProperty(name:*, value:*):void{
            for each(var superClass:Object in superArray){
                if( name in superClass){
                    superClass[name] = value;
                    return;
                }
            }
            throw new Error('no such property');
        }

        flash_proxy override function callProperty(name:*, ...args):*{
            for each(var superClass:Object in superArray){
                if( name in superClass){
                    var f:Function = superClass[name] as Function;                  
                    return f.apply(this, args);
                }
            }
            throw new Error('no such function');
        }
    }
}

您还可以使用类似 javascript 的类构造(即仅使用简单的 Object 并以您想要的任何组合为其分配属性和函数)。

于 2013-02-14T06:48:02.227 回答