2011-10-17 41 views
1

我有這樣重寫公共變量與集

class Base { 
    public var space:Number; 
} 

一個基類,它得到由

class Desc extends Base { 

    override public function set space(space:Number):void { 
     //code 
    } 

} 

這個擴展不會編譯。比如,你沒有對基類的控制,那裏有什麼方法實現相同的東西?

顯而易見的是創建一個函數setSpace(),但是此對象正在嵌入已使用public space的系統中。

在此先感謝。

+0

您需要在'public'之前有'override'嗎? –

+0

是的,你這樣做,我忘記了。但它不編譯,「不兼容覆蓋」 – NebulaFox

+0

也,你可能需要引用'空間'爲'super.space'。所以在你的'set'中,你需要設置你自己的空間變量(在該類中聲明),然後調用super.space。 –

回答

3

你的基類應該被定義方式:

class Base { 

    // Don't use public variables. Make them private and define setters and getters 
    private var space_:Number; 

    public function get space():Number { 
     return space_; 
    } 

    public function set space(v:Number):void { 
     if (space_ === v) return; 
     space_ = v; 
    } 

} 

然後它可以重載這種方式:

class Desc extends Base { 

    override public function set space(space:Number):void { 
     //code 
    } 

} 

編輯:

我錯過了一部分,你說你不能控制基類。在這種情況下,希望space被定義爲一個getter/setter(它應該是如果類正確實現的話)。如果不是,你將不得不使用一個函數,如getSpacesetSpace

3

Adobe

正在使用var關鍵字聲明類的成員變量不能 在子類中被覆蓋。

在你的情況下使用setter不是一個選項。如果您需要保留界面,請使用組合而不是繼承:

class Desc { 

    private var _base:Base; 

    public function set space(space:Number):void { 
    //code 
    this._base.space = space; 
    } 
}