2011-05-30 52 views
0

我想在ActionScript中創建一個自定義按鈕。Actionscript 3.0 - >如何覆蓋來自UIComponent的受保護方法

這是我的代碼:

import flash.events.MouseEvent; 

import mx.controls.Alert; 

import spark.components.Button; 

public class BookViewButton extends Button 
{ 
    public function BookViewButton() 
    { 
     super(); 
    } 
    override protected function mouseOver(event:MouseEvent,increase:int,newImageSource:String):void{ 
     Alert.show("mouseOver for new class works"); 
    } 
} 

但是Adobe Flash Builder的信號的方法重載線路爲錯誤。

我試圖改變新的方法簽名,以便它完全匹配,就像這樣:(我認爲這個錯誤可能是因爲我給mouseOver函數添加了額外的參數,所以Flex可能不會將它識別爲重寫)

 override protected function mouseOver(event:MouseEvent):void{ 
     Alert.show("mouseOver for new class works"); 
    } 

但仍然無效。同樣的小紅色驚歎號出現信號錯誤。

我非常感謝任何幫助。謝謝。

回答

2

做,如果你有星火Button層次mouseOver()方法你用什麼版本的SDK?

Spark按鈕具有mouseEventHandler()方法重寫:

override protected function mouseEventHandler(event:Event):void 
{ 
    super.mouseEventHandler(event); 
    var mouseEvent:MouseEvent = event as MouseEvent; 
    if (event.type == MouseEvent.ROLL_OVER) 
    { 
     // My roll over logic here 
    } 
} 

而且最好是發佈一個IDE爲您提供了錯誤的文字。要複製它只需在Flash Builder中打開​​視圖,找到了您的錯誤消息並通過上下文菜單複製它。

+0

但請解釋我在哪裏發現'mouseOver()'方法來覆蓋? – Constantiner 2011-05-30 07:23:06

+0

我真的沒有在任何地方找到它。我有點猜測應該有這樣的方法。或者,也許我誤解了一些信息。我不知道。現在是我住的地方上午04點30分。這應該部分解釋這一點。 =) – 2011-05-30 07:26:10

+0

嗯..如果我正確理解你,你正在調用超類'eventHandler和*然後*添加額外的邏輯呢? – 2011-05-30 07:26:45

1

此處不能使用override,因爲基類Button沒有要覆蓋的方法mouseOver

如果你刪除了override關鍵字,它應該可以正常工作。也就是說,您需要爲您的函數實際添加一個偵聽器,以便在您將鼠標懸停時調用它。就像這樣:

import flash.events.MouseEvent; 
import mx.controls.Alert; 
import spark.components.Button; 

public class BookViewButton extends Button 
{ 
    public function BookViewButton() 
    { 
     addEventListener(MouseEvent.MOUSE_OVER, _mouseOver); 
    } 

    private function _mouseOver(event:MouseEvent):void 
    { 
     Alert.show("mouseOver for new class works"); 
    } 
} 

信息上​​

沒有必要調用超在延伸類的構造函數,除非有要分析的論點。例。

package 
{ 
    public class A extends Object 
    { 
     public function A() 
     { 
      trace("A"); 
     } 
    } 
} 

和延伸類:

package 
{ 
    public class B extends A 
    { 
     public function B() 
     { 
      trace("B"); 
     } 
    } 
} 

如果我們這樣做:

var thing:B = new B(); 

您將有輸出:

A 
B 

但是,如果你想論據你的構造函數,你需要解析m直到您使用super()擴展的類的構造函數。像這樣:

public class A extends Object 
{ 
    public function A(arg:String) 
    { 
     trace(arg); 
    } 
} 

public class B extends A 
{ 
    public function B(arg:String) 
    { 
     super(arg); 
    } 
} 

現在,這將輸出 「ASDF」:

var thing:B = new B("asdf"); 
+0

嗯,這是有道理的。但是,我真的應該像在代碼中一樣去除對超類構造函數('super()')的調用嗎? – 2011-05-30 07:09:26

+0

我會更新我的答案,以更清晰地回答。 – Marty 2011-05-30 07:12:03

+0

感謝您編寫所有這些問題。我只是想知道,因爲我基本上擴展了基本的Button類,所以我應該調用超類的構造函數,然後爲我的自定義按鈕創建額外的行爲。但顯然不是。謝謝。 – 2011-05-30 07:19:52