我想在Scala中创建一个计算器,我需要将小数和加法运算结合起来。加法动作将需要覆盖先前的运算符动作,因此,如果用户按下[4,-,+,2,=],则将返回6。问题是两个动作都必须在不使用条件的情况下执行,例如匹配/大小写或循环。该怎么办?这是我尝试过的。
import javafx.event.{ActionEvent, EventHandler}
class Calculator(){
//this is what will appear on the calculator
def displayNumber(): Double={
0.0
}
class DecimalAction(calculator: Calculator) extends EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = {
calculator.displayNumber() = calculator.displayNumber() + ".".toInt
}
}
class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = {
calculator.displayNumber() = calculator.displayNumber() + "+".toInt
}
}
答案 0 :(得分:1)
在您的计算器课程中,您需要跟踪下一步将进行的操作(如果有)。
var nextOperation: Optional[Operation] = None
我将在下面定义Operation
。然后,在操作类中,您可以设置nextOperation
,如果已经将其设置为其他值,则将其覆盖。
class DecimalAction(calculator: Calculator) extends EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = {
calculator.nextOperation = Some(Decimal)
}
}
class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = {
calculator.nextOperation = Some(Add)
}
}
现在,我们使用Operation
方法将combine
定义为密封特征,该方法可以完成两个数字的加,减或十进制连接。当您在combine
上调用Operation
时,它将使用dynamic dispatch而非条件来选择正确的方法。
sealed trait Operation {
/** Combine the existing number with the new digits under the current operation. */
def combine(x: Double, y: Seq[Int]): Double
}
case object Decimal extends Operation {
def combine(x: Double, y: Seq[Int]) = ???
}
case object Add extends Operation {
def combine(x: Double, y: Seq[Int]) = ???
}
其余的取决于您要如何实现计算器,但是您可能不得不考虑一些运算顺序(例如,十进制可能优先于加法运算。)