2013-04-16 126 views
0

創建class A與字段:繼承實例變量

public var button1:Button; 
public var button2:Button; 

class B extends class A和剛剛場

public var button1:Button; 

我創建一個對象是這樣的:

var but:A = new B(); 

,然後我把它放在代碼中:

but.button1.someproperty = ... 

哪個按鈕真的被引用? button1是類A中的按鈕還是類B中的button1?

回答

1

不允許覆蓋變量。如果class A已經有該名稱的變量,則不能在class B extends class A中定義public var button1:Button;。它應該是一個編譯錯誤。從Adobe的教程

摘錄:被聲明爲var或const關鍵字繼承,但不能被重寫

屬性。重寫屬性意味着重新定義子類中的屬性。可以重寫的屬性的唯一類型是方法 - 即使用function關鍵字聲明的屬性。雖然不能覆蓋實例變量,但可以通過爲實例變量創建getter和setter方法並覆蓋方法來實現類似的功能。

欲瞭解更多read here

+0

thanks !!可能在我的情況下是允許的,因爲我也使用flex。但我不確定,我是新手! – FeDeGbR

+0

我的情況永遠不會是你的情況,它的情況。閱讀文檔,你一定會得到編譯錯誤! – NINCOMPOOP

+0

好!經過一些測試,我構成了你的答案!雅我也讀文檔;) – FeDeGbR

0

變量but屬於A類型,但保留B類型的一個實例,該實例是A的子類型(並且與變量兼容)。所以最後,它指向B的實例;所以你的button1將是B的。

請注意,B也有一個按鈕1,因爲那個在A中定義(它仍然屬於B雖然)。

儘管如此,由於無法覆蓋字段,因此無法真正做到這一點,因此您無法在B(因爲它已在A中定義)再次定義button1。一個更好的例子來展示擴展類型的效果會是這樣的:

public class A 
{ 
    public function test() : void 
    { 
     trace('test() in A!'); 
    } 
} 
public class B extends A 
{ 
    public function test() : void 
    { 
     trace('test() in B!'); 
    } 
} 

var x:A = new B(); 
x.test(); 
+0

謝謝傢伙!現在我測試你的解決方案,它應該是正確的 – FeDeGbR

+0

你引用的例子並不符合所問的問題。該示例適用於方法重寫,但在Actionscript中,變量重寫是非法的。 – NINCOMPOOP

+0

@NoobUnChained請閱讀我的第三段,我知道這一點。我把這個問題更多地理解爲關於多態性的一般問題,只是一個壞例子(由於語法無效)將問題指出來。因此,更好的例子顯示了重寫的工作原理。 – poke