2012-04-29 62 views
0




根據「工廠」設計模式構建一個庫,我需要區分認爲是「只讀」的接口和那些也可以擁有寫權限的接口。因此,我開發了以下模式:actionscript奇怪的getter/setter訪問

public interface IReadOnly { 
    function get value(): Number; 
} 
public interface IReadWrite extends IReadOnly { 
    function set value (v:Number): void; 
} 
internal class ReadWrite implements IReadWrite { 
    public function get value(): Number { 
     return m_value; 
    } 
    public function set value (v:Number): void { 
     m_value = v; 
    } 
    protected var m_value:Number; 
} 

所以問題是:我無法訪問類的實例上的getter。 Flex的將拒絕編譯下面的代碼:

function doSomething (rw:IReadWrite): void { 
    var num:Number = rw.value; 
} 

Flex的告訴我:「1178:通過靜態類型IReadWrite參考無法訪問屬性值的嘗試訪問」
當我用一個簡單的函數替換setter時,例如function setValue (v:Number): void;,每件事情都很順利。

有人已經遇到這種情況?這是一個編譯器錯誤?任何可以解決問題的編譯器參數?

感謝您的關注。

回答

0

不知道你是否設法解決這個問題,但我找到了解決方法。您需要將getter被調用的對象轉換爲實際定義getter方法的接口。所以函數調用看起來是這樣的:

function doSomething (rw:IReadWrite): void { 
    var num:Number = IReadOnly(rw).value; 
} 

它看起來很醜,但它完成了工作。

+0

謝謝!是的,醜陋的,並不真正「用戶友好」,因爲我的代碼將被打包到其他開發人員的圖書館。但有了明確的文檔,這讓我有一個很好的lib設計。 (我想提出你的答案,但我不能,因爲我的「聲譽」還不夠好......) – Clem 2013-06-26 10:34:06

1

IReadWrite接口錯誤地擴展了ReadWrite類;它需要擴展IReadOnly接口。

我很驚訝編譯器甚至讓你聲明一個擴展類的接口。

+1

我並不感到驚訝,畢竟這是閃光的。大聲笑 – 2012-04-29 05:47:05

+0

對不起,例如,我忘記了在「IReadWrite」接口聲明的「ReadOnly」前面的「I」。所以,我的IReadWrite接口確實擴展了IReadOnly接口。我編輯我的帖子來糾正這個錯誤。 – Clem 2012-04-29 08:00:11