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()
    {
    }
}

(それができないことはわかっています。)

ありがとう!

更新: ありがとうございました!

たぶん、これは私のニーズをより明確にします...ビジネスレイヤーには、メニューからウィンドウに渡されるプロセスID(およびビジネスID、オペレーションID、ローカリティIDなど)と呼ばれる変数があり、ウィンドウはそれをモジュールに渡します。モジュール コンテナーでは、この変数をパラメーターとして使用してデータベースをクエリする CustomComponent があります。これは、モジュールのすべての (ほぼ) コンポーネントに適用されます。これらの変数はレベル ビジネス レイヤーとして定義されます。次に、これらの変数 (およびビジネス ロジックを使用してこれらの変数で動作するいくつかの関連メソッド) を格納および管理するためのクラスを定義します。私の共通のコンポーネント。アイデアは... 新しい CustomComponent を挿入し、次のように mxml を介してこれらの変数を設定します。

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

モジュールには、変数を設定する (設定しない) ためのビジネス ロジックがあります。

それ以外の場合は、親の変数を読み取るために CustomComponent (およびモジュール) に別のロジックを実装し、これらの変数を MyWindow でのみ定義する必要があります (複合パターンを使用)。

4

2 に答える 2

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 のようなクラス構成を使用することもできます (つまり、単純なオブジェクトを使用し、必要な組み合わせでプロパティと関数を割り当てるだけです)。

于 2013-02-14T06:48:02.227 に答える
0

次のリンクから回答を得ることができます -

http://flexinonroids.wordpress.com/2009/05/27/flex-3-dynamically-loading-components-at-runtime/ http://thecomcor.blogspot.in/2007/11/adobe-flex-dynamically-読み込み-classes.html

または、以下のアプローチに従うことができます -

1) ベースとしてインターフェースを作成する
2) インターフェースを使用してクラスを拡張する
3) SWFLoader.loaderContext.applicationDomain.getDefinition メソッドを使用して実行時にクラスをロードする

ありがとう、

ヴァルン

于 2013-02-14T08:54:22.017 に答える