2013-02-14 91 views
0

我想在其他類上公開(友好)基本屬性,方法和事件。事情是這樣的:flex繼承類共享

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等)什麼被傳遞到窗口從菜單,和窗口傳遞給模塊。在Module Container上,我有一個CustomComponent使用這個變量作爲參數的查詢數據庫。這適用於模塊上的所有(幾乎)組件。這些變量被定義爲級別業務層,然後我定義一個類來存儲和管理這些變量(以及一些使用業務邏輯與這些變量一起操作的相關方法),所以我可以爲每個環境創建一個獨立的類(或庫)來重用我的共同組件。這個想法是......插入新CustomComponent並通過MXML設置這些變量,像這樣:

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

模塊具有集業務邏輯(O不可)任何變量。否則,我將不得不爲CustomComponent(和Module)實現讀取父變量的不同邏輯,並僅在MyWindow中定義這些變量(使用組合模式)。

+1

你有問題嗎? – JeffryHouser 2013-02-14 02:00:47

回答

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樣一流的施工(即。只需使用簡單的對象並以任意組合將屬性和功能分配給它即可)。

+0

所有的類都在同一個庫項目中,所以沒有訪問問題。我想要的不是在每個班級中定義「foo」。 – Ragys 2013-02-14 12:06:24

+0

然後你可能想讓你的類作爲代理的子類,將你想成爲你的超類的所有類添加爲新類的成員,並實現對成員成員的訪問。您可能還想使用一些代碼生成工具,如velocity模板。 – user1875642 2013-02-14 15:47:56

+0

哇!有趣的...不知道代理模式...我需要研究...你能幫我一個例子嗎? – Ragys 2013-02-19 01:29:47

0

你可以從下面的鏈接你的答案 -

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

或者你可以按照下面的方法 -

1)創建一個接口爲基礎
2)擴展你的類與接口
3)在運行時加載類與SWFLoader.loaderContext.applicationDomain.ge tDefinition方法

感謝,

Varun的

+0

如果使用接口,我必須實現每個類中實現的方法,這正是我們不想要的......我想要類似於接口的反例。所有類都在同一個庫項目中,所以定義訪問沒有問題。 – Ragys 2013-02-14 12:10:12