2011-05-30 70 views
0

這個問題是從ActionScript的上下文構成的,但可以同樣來自Java。擴展對象時;爲什麼不在改變對象成員時使用「this」而不是「super」

我用作樣本的代碼來自adobe.com/devnet/flex/articles/flex4_skinning.html。在以下的代碼提取中,NoteCard類的已啓用已禁用狀態,它繼承自SkinnableComponent類。我的問題是;爲什麼我們在啓用的setter中調用super.enabled = value;而不是this.enabled = value ;.我們已經從構造函數創建了我們的NoteCard對象實例,並且我們是否應該使用「this」關鍵字來設置成員成員的值。如果你換了super對於這個編譯器沒有顯示錯誤,但代碼無法工作。

package 
    { 

    import spark.components.supportClasses.SkinnableComponent; 

     public class NoteCard extends SkinnableComponent 
     { 
     public function NoteCard() 
     { 
     super(); 
     } 


     override public function set enabled(value:Boolean) : void 
     { 
     if (enabled != value) 
     invalidateSkinState(); 

     super.enabled = value; 
     } 

     override protected function getCurrentSkinState() : String 
     { 
     if (!enabled) 
     return "disabled"; 

     return "normal" 
     } 

    } 
    }   

回答

2

如果我們將使用:

override public function set enabled(value:Boolean) : void 
    { 
    if (enabled != value) 
    invalidateSkinState(); 

    enabled = value; 
    } 

我們會碰到無限循環。此行:

enabled = value; 

會一次又一次地調用同一個setter。

+0

不相關,但我使用這種相同類型的例子在面試測試中使用devs – divillysausages 2011-05-30 11:33:35

0

在這種特殊情況下,您會覆蓋一個類的setter。您可以實現自己的附加代碼來處理新設置的值,但是也應該調用超類中的代碼,因爲您可能不知道基類設置器會執行什麼操作(可能會使用值設置私有變量)。您必須致電super.setterName = value以確保這一點。如果你打電話給this,你會在無限循環中調用你實現的setter。如果您確定,您可以省略呼叫super,這不是必需的。

+0

我現在明白了嗎?謝謝。它現在直線前進,我的眼睛已經打開,但真正的基本點。 – 2011-05-31 14:48:29

相關問題