2013-05-01 8 views
1

В Скале У меня есть эта функция:Как бы я переопределить функцию в 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" 

То, что я хочу сделать, это когда игрок нажимает клавишу «с» в моем матче заявление:

case 'c' => 

Я хочу, чтобы вызвать эту функцию и переопределить выше функцию, чтобы она больше не работает:

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

Спасибо

ответ

2

Вы могли бы начать с объявления var провести функцию по умолчанию для обработки столкновения, как так:

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

Тогда ваша функция handleCollision будет изменен на это:

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

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

Тогда, когда вы нажмете свое состояние обмана, вы обновите функцию collisionFunction следующим образом:

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

Это немного грубо, поскольку у него есть изменяемая переменная для обмена функциями, но она будет работать для того, что вы хотите сделать.

+0

Все ответы хороши, но это один именно то, что мне было нужно. Спасибо! – Chris

1

Вы можете ввести var f, который вы инициализируетесь

f = handleCollision 

Тогда в вашем случае заявлении установить

f = cheatKey 

И использовать f где бы вы использовали либо cheatKey или handleCollision.

Это в основном Strategy pattern.

1

подкласс, а затем:

override def handleCollision = { 
    if (cheat) cheatKey else super.handleCollision 
} 
Смежные вопросы