2015-01-03 68 views
1

比方說,我們有超A和子類B:AS3:調用超類方法而不是子類實例的覆蓋?

public class A { 
    public function f() {...} 
} 

public class B extends A { 
    override public function f() {...} 
} 

超類有一個所謂的F方法,和子類B有對於f覆蓋。現在我有B類的一個實例:

var b:B = new B(); 

是無法調用B的的F超類版本,通過執行類似b.super.f()?沒有爲B顯式調用super.f();

回答

0

簡短的回答:類,但它不好玩

龍答:我本來以爲它會使用Function對象,要麼apply()call(),但有可能的,即使文檔(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Function.html#apply())說你可以傳遞另一個對象,它不起作用,它總是與聲明的類綁定。

... 
public function foo():void 
{ 
    trace(this); 
} 
... 

var func:Function = a.foo; 
func.apply(b); // traces a 

周圍有點磕磕絆絆之後,我碰到這個來得如此回答(Function.apply not using thisArg parameter),這可以解釋爲什麼這不工作(tldr;這是因爲方法是邊界在它們的實例上創建)。

雖然可以使用prototype來解決這個問題。你只需要聲明你的類是這樣的:

public dynamic class A 
{ 
    prototype.foo = function():void 
    { 
     trace(this); 
    }  
} 

注意函數聲明的風格和類dynamic屬性。該foo()功能將不會在創建的約束,所以你可以這樣調用它:

var func:Function = a.foo; 
func.apply(a); // traces a 
func.apply(b); // traces b 

這個工程即使B聲明瞭foo另一種方法。

總之,要得到它的工作/缺點:

  • 你需要讓你的類動態(因此更大,並且能夠增加你想要什麼PARAM)
  • 您需要破解的聲明函數本身的
  • 您需要訪問一個基類對象Function(雖然你可以叫(new A).foo
  • 你沒有得到代碼完成

總而言之,在B上創建一個方法來公開A的功能(或者如果您發現自己需要從外部調用該功能,只需將其分解爲專用功能,並將其與其他任何公共對象func)

相關問題