2013-05-01 35 views
1

在Scala中我有這樣的功能:我該如何重寫Scala中的另一個函數?

def handleCollision { 
    walls.foreach(w => if (curPlayer.intersects(w)) { 
      curPlayer.setLocation(playerStartPos._1, playerStartPos._2) 
      updateLives(-1) 
     }) 
    obstacles.foreach(o => if (curPlayer.intersects(o)) { 
      curPlayer.setLocation(playerStartPos._1, playerStartPos._2) 
      updateLives(-1) 
     }) 
} // End "handleCollision" 

當球員擊打鍵「C」在我的匹配語句我想要做的是:

case 'c' => 

我想它來調用這個函數並覆蓋上述功能,使其不再工作:

def cheatKey { 
    walls.foreach(w => if (curPlayer.intersects(w)) { 
      updateLives(+0) 
     }) 
    obstacles.foreach(o => if (curPlayer.intersects(o)) { 
      updateLives(+0) 
     }) 
} 

謝謝

回答

2

你可以通過聲明var保持默認的功能處理,像這樣的碰撞開始

def handleCollision { 
    walls.foreach(w => if (curPlayer.intersects(w)) { 
    collisionFunction() 
    }) 

    obstacles.foreach(o => if (curPlayer.intersects(o)) { 
    collisionFunction() 
    }) 
} 

然後,當你碰到你的作弊條件時,你會更新collisionFunction像這樣:

collisionFunction =() => { 
    updateLives(+0) 
} 

這有點粗糙,因爲它有一個用於函數交換的可變變量,但它可以用於你想要做的事情。

+0

所有答案都不錯,但是這一次是正是我需要的。謝謝! – Chris 2013-05-01 23:16:37

1

可以引入var f,你初始化

f = handleCollision 

然後在你的case語句設置

f = cheatKey 

並使用f,你會使用,也可以cheatKeyhandleCollision

這基本上是Strategy pattern

var collisionFunction =() => { 
    curPlayer.setLocation(playerStartPos._1, playerStartPos._2) 
    updateLives(-1)  
} 

然後,你handleCollision功能將變爲此:

1

子類,然後:

override def handleCollision = { 
    if (cheat) cheatKey else super.handleCollision 
} 
相關問題