2012-06-15 50 views
0

我有一個類Pawn,它是遊戲中所有「角色」的基類,具有健康等屬性,可以移動並死或說話等。擴展這個類的一個類是「男孩」類。 「男孩」級是玩家在這個遊戲中控制的角色。在AS3中使用接受不同類型參數的方法創建子類

爲了控制字符「狀態」,創建了狀態類。這些方法具有onEnterState,onStateTick和onLeaveState等方法。一個狀態可以用來表示蹲下,走路,跳躍,並且將發送諸如「keyPressed」「< - 」之類的消息來處理或忽略,因爲它選擇了。

我的問題是,我的基地「狀態」類有方法如下:

function onEnter (pawn:Pawn) :void; 
function onLeave (pawn:Pawn) :void;  
function onGameTick (pawn:Pawn) :void;   
function onAnimEnd (pawn:Pawn) :void; 

正如你可以看到這實際上是一個接口,但我沒有嘗試基類第一,直到它變得明顯的ActionScript3沒有按不喜歡抽象類。

因此,無論如何,一個類「BoyJumpState」顯然需要擴展/實現這個類/接口,以確保公共方法在那裏進行交互,然而,這阻礙了ActionScript不允許我擴展,說,這個:

public override function onEnter (boy:Boy) :void { trace("Hey"); } 

這是拒絕編譯時,因爲它不符合藍圖(即它不接受一個典當)。但是,我需要它接受一個男孩,因爲方法體中需要使用特定於該類的方法!

我搞清楚我原來的接口是問題,那我應該指定的參數應該改爲延長典當實際上並不需要是一個,但我沒有看到任何方式來實現這個動作腳本。

......或者我可能完全處於錯誤的軌道上,在這種情況下,會非常感激地收到建議!

我意識到我不能繼承繼續,但我所做的遊戲更多的是面向對象編程的實踐,因爲它比我以前的規模更大。然而,我已經擺脫了我的舒適語言(Java),我真的超越了自己在這裏做什麼。

任何幫助,將不勝感激,謝謝。

+0

你沒有得到某種抽象類爲你服務的具體問題是什麼?我感到困惑,因爲無論何時將基類應用於庫元件,基類都充當抽象類,並且爲庫元件生成的類是特定的實現。這只是一個例子,但我始終使用Abstract/Base類。 –

回答

1

您不需要覆蓋重寫的方法的簽名以匹配協變類型。如果在子類的方法中需要特定的類型,則必須檢查/轉換重寫的方法。

+0

它聽起來像你說的是不需要重寫,而是它會創建一個重載方法?這並不意味着接口契約不會成功實現,因爲沒有onEnter(典當:典當),只有onEnter(男孩:男孩)?這可能會完全打敗界面的目的。 – Toby

+0

嗯,這取決於。如果Boy提供完整的合同,Pawn應該以不同的方式執行合同。所以一個基本的接口可以滿足功能。 ActionScript沒有泛型,並且不允許共同或逆變方法簽名覆蓋,所以基本上取決於您要完成的內容。 –

+0

認識到我從來沒有選擇一個最好的問題很久以前問過。我有多粗魯。感謝您的回答,我最終實現了建議。 – Toby

1

當您在AS3中實現接口時,簽名必須完全匹配。

你可以在運行時檢查類型,像這樣:

public override function onEnter (pawn:Pawn) :void 
{ 
    var boy:Boy = pawn as Boy; 
    if(boy) 
    { 
     trace("Hey"); 
    } 
} 
0
public override function onEnter (pawn:Pawn) :void 
{ 
    if(pawn is Boy) 
    { 
    //do something else 
    } 
    else 
    { 
    //do the normal 
    super.onEnter(pawn); 
    } 
} 
0

我想我會通過向上轉型到我需要在每個具體的類,型解決這個問題,以便根據您的例子:

public override function onEnter (boy:Boy) :void { trace("Hey"); } 

我將其更改爲:

public override function onEnter (pawn:Pawn) :void 
{ 
    // do something all pawns can do! 
    pawn.move(); 

    // do something only a boy can do! 
    Boy(pawn).doSomething(); 
} 

我肯定會使用一個基類,是的,它的確如此,Actionscript 3不像Java那樣支持抽象類,但是這不會阻止你創建一個基類並重寫這些方法,我仍然會無論如何,將基類輸入到接口。

0

我認爲你需要一個由BoyPawn實現的接口,可以說IPlayer

public class Boy extends Sprite implements IPlayer 

而且

public class Pawn extends Sprite implements IPlayer 

您創建了一個名爲IPlayer具有所有匹配的公共職能和getter/setter方法的接口。

package 
{ 
    public interface IPlayer 
    { 
     function destroy():void; 
     function get x():Number; 
     function get y():Number; 
    } 
} 

現在,您可以更新功能,這樣

function onEnter (player:IPlayer) :void; 
function onLeave (player:IPlayer) :void;       
function onGameTick (player:IPlayer) :void;         
function onAnimEnd (player:IPlayer) :void; 

如果擴展你沒有與overrriding的參數的類型問題類,因爲類型是有點抽象成一個接口,兩個類都擴展了。

相關問題